web-dev-qa-db-fra.com

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

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 est contenu dans un plugin appelé "Protocole WP Facebook Open Graph". 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 échoue toujours et get_the_excerpt($post->ID) ne fonctionne plus (obsolète).

Alors, comment puis-je afficher l'extrait ici?

ps: J'utilise aussi le plugin "Advanced Excerpt"

30
ariel

je l'ai eu en utilisant my_excerpt($post->post_content, get_the_excerpt()) et en utilisant la fonction my_excerpt() de Utilisation de wp_trim_excerpt pour obtenir le_excerpt () en dehors de la boucle

5
ariel

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

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

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

27
cale_b

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

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

La fonction setup_postdata() va globaliser l'objet $post et le rendre disponible pour l'ancienne fonction de boucle standard. Lorsque vous êtes à l'intérieur de la boucle, vous appelez the_post() et cela configure tout pour vous ... en dehors de la boucle, vous devez le forcer manuellement.

21
EAMann

Essaye ça:

Créez une nouvelle fonction dans functions.php, puis appelez-la de 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.

18
Withers Davis

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

8
docker

C'est pour quand vous voulez utiliser get_the_excerpt() en 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;
}
1
Gixty

Si 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;
}
1
OKParrothead

Si vous souhaitez générer l'extrait automatiquement à partir du contenu en une seule ligne, vous pouvez utiliser wp_trim_words function comme ceci:

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
1
Picard