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"


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));


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.


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.


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.


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


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;
}

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;
}

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);

-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;

Veuillez modifier votre réponse et ajouter une explication: pourquoi cela pourrait-il résoudre le problème?
— fuxia
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.