Obtenez un extrait en utilisant get_the_excerpt en dehors d'une boucle

31

J'ai un code qui appelle get_the_title()et cela fonctionne, mais get_the_excerpt()retourne vide. Comment puis-je le faire fonctionner?

Ce code se trouve dans un plugin appelé "WP Facebook Open Graph protocol". Voici la partie que je veux changer:

if (is_singular('post')) {
  if (has_excerpt($post->ID)) {
    echo "\t<meta property='og:description' content='".esc_attr(strip_tags(get_the_excerpt($post->ID)))."' />\n";
  }else{
    echo "\t<meta property='og:description' content='". [?] ."' />\n";
  }
}else{
  echo "\t<meta property='og:description' content='".get_bloginfo('description')."' />\n";
}

Ici, has_excerptéchouez toujours et get_the_excerpt($post->ID)ne fonctionnent plus (obsolète).

Alors, comment puis-je afficher l'extrait là-bas?

ps: j'utilise aussi le plugin "Advanced Exterpt"

ariel
la source
ok, je l'ai obtenu en utilisant my_excerpt($post->post_content, get_the_excerpt())et en utilisant la my_excerpt()fonction de wordpress.stackexchange.com/questions/6961/…
ariel
3
Veuillez ajouter la solution que vous avez trouvée comme réponse, afin que cela ne hante pas le site comme une question sans réponse. :)
Rarst
Il suffit d'utiliser la fonction the_post()(cela fonctionne aussi sur le modèle de publication unique) avant de l'appeler get_the_excerpt()pour configurer les données nécessaires pour vous.
Sisir

Réponses:

29

J'ai trouvé cette question en cherchant comment faire cela sans l'objet post.

Mes recherches supplémentaires ont révélé cette technique élégante:

$text = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_id));

cale_b
la source
1
Cela devrait être accepté comme réponse car c'est la façon recommandée d'extraire des données de la boucle. Ne nécessite pas non plus de fonction personnalisée ni de substitution de la $postvariable globale.
MacK
4
il renvoie une chaîne vide.
Kyaw Tun
1
@KyawTun - cela fonctionne, tant qu'il $post_idest défini (quelle est la valeur de $post_id? ET $post_idest un ID de poste valide et légitime.
cale_b
2
@cale_b Merci. J'utilise la requête get_posts et j'obtiens l'ID du tableau résultant. L'objet de publication a post_title, post_content, ID, etc. Mais ne fonctionne pas.
Kyaw Tun
Si vous avez besoin de JUSTE le TEXTE et non la balise <p> qui est incluse avec le filtre_excerpt, alors utilisez le filtre "get_the_excerpt", de sorte que le filtre ci-dessus devienne: $ text = apply_filters ('get_the_excerpt', get_post_field ('post_excerpt', $ post_id) ); cela vous donnera juste le texte RAW que vous pouvez insérer n'importe où dans votre propre balisage.
Mohsin
22

Comme il semble que vous ayez déjà l'objet post dont vous avez besoin de l'extrait, vous pouvez simplement forcer les choses à fonctionner:

setup_postdata( $post );
$excerpt = get_the_excerpt();

La setup_postdata()fonction globalisera l' $postobjet et le rendra disponible pour l'ancienne fonction de boucle régulière. Lorsque vous êtes à l'intérieur de la boucle, vous appelez the_post()et cela configure les choses pour vous ... en dehors de la boucle, vous devez la forcer manuellement.

EAMann
la source
1
Cela fonctionne mais: "Vous devez passer une référence à la $postvariable globale , sinon les fonctions comme the_title()ne fonctionnent pas correctement." global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
Deach
setup_postdata($post);FTW !!!!
squarecandy
18

Essaye ça:

Créez une nouvelle fonction dans functions.php, puis appelez-la depuis n'importe où.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id); //Gets post ID
    $the_excerpt = $the_post->post_content; //Gets post_content to be used as a basis for the excerpt
    $excerpt_length = 35; //Sets excerpt length by word count
    $the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Strips tags and images
    $words = explode(' ', $the_excerpt, $excerpt_length + 1);

    if(count($words) > $excerpt_length) :
        array_pop($words);
        array_push($words, '…');
        $the_excerpt = implode(' ', $words);
    endif;

    $the_excerpt = '<p>' . $the_excerpt . '</p>';

    return $the_excerpt;
}

Voici un article décrivant le code.

Withers Davis
la source
1
Excellent trouver mon ami. Je n'ai jamais compris pourquoi WordPress aurait déconseillé une fonction aussi critique. C'est effectivement le reconstruire à partir de zéro, mais cela fonctionne. Étant donné la fréquence à laquelle nous utilisons l'extrait en dehors de la boucle avec des fonctionnalités telles que les plugins de partage social, il aurait probablement dû rester une partie du noyau.
Imperative Ideas
1
La réponse d'EAMann est une bien meilleure approche de ce problème et devrait être considérée comme la meilleure pratique. Cette approche consiste essentiellement à dupliquer les composants internes de Core au lieu d'utiliser l'API.
Ian Dunn
9

Maintenant, vous pouvez simplement utiliser la get_the_excerpt( $postID )fonction. Depuis: WordPress 4.5.0 a introduit le $postparamètre.

docker
la source
1
Cela devrait être une nouvelle réponse acceptée puisque nous sommes dans l'ère WP 4.5 +.
Matija Mrkaic
18
Cela ne fonctionnera pas si l'extrait est vide car le wp_trim_excerptfiltre renverra l'extrait pour le message actuel.
Dylan
9
Voir core.trac.wordpress.org/ticket/36934 pour plus de détails sur ce que @Dylan a dit
kraftner
5

l'a obtenu en utilisant my_excerpt($post->post_content, get_the_excerpt())et en utilisant la my_excerpt()fonction à l' aide de wp_trim_excerpt pour obtenir the_excerpt () en dehors de la boucle

ariel
la source
2
Les réponses en lien uniquement ne sont pas bonnes. Copiez le code correspondant ici. Lorsque ce lien est rompu, ce site est en panne / disparu, alors cette réponse n'a aucune valeur.
cale_b
Cela a parfaitement fonctionné pour moi!
Saikat
1

Dans le cas où vous n'avez pas l'objet post, voici une courte fonction comme celle de Withers.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id);
    $the_excerpt = $the_post->post_excerpt; 
    return $the_excerpt;
}
OKParrothead
la source
Mais le demandeur a un objet postal comme indiqué dans la question.
fuxia
3
Corrigez-moi si je me trompe, cette méthode retournera l'extrait manuel mais n'en générera pas si nécessaire
Bill
1

C'est pour quand vous voulez utiliser en get_the_excerpt()dehors de la boucle:

function custom_get_excerpt($post_id) {
    $temp = $post;
    $post = get_post($post_id);
    setup_postdata($post);

    $excerpt = get_the_excerpt();

    wp_reset_postdata();
    $post = $temp;

    return $excerpt;
}
Gixty
la source
C'est la façon la plus directe de le faire. Je ne suis pas sûr que ce soit une excellente performance. Vous obtenez toujours mon +1
Bill
1

Si vous souhaitez générer l'extrait automatiquement à partir du contenu sur une seule ligne - vous pouvez utiliser une wp_trim_wordsfonction comme celle-ci:

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
Picard
la source
-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;
Rinzler
la source
Veuillez modifier votre réponse et ajouter une explication: pourquoi cela pourrait-il résoudre le problème?
fuxia