OBTENIR l'extrait par ID

31

Pourquoi ne peut-on pas obtenir l'extrait par ID comme avec le titre et la plupart des autres éléments.

par exemple. get_the_excerpt (ID). Je sais comment l'utiliser avec la fonction $ post-> post_excerpt mais cela ne retourne pas une partie du contenu si aucun extrait n'a été entré, il ne renvoie rien.

Donc, ce que j'essaie de faire est d'obtenir l'extrait par ID s'il y a un extrait, et s'il n'y a pas d'extrait avec cet ID mais qu'il y a du contenu, pour obtenir une partie du contenu à la place.

Comment ferait-on cela.

Des idées,

Merveilleux ...

MODIFIER --

Bouclez le code source comme demandé.

<?php $stories = get_posts('category_name=feedback&numberposts=4'); 
            foreach ($stories as $post) :
            $title = $post->post_title;
            $excerpt = get_the_excerpt_id($post->ID);
            $thumb = get_the_post_thumbnail($post->ID,array(60, 60, true));?>
              <div class="textstandard_white" style="font-size:14px; line-height:22px; padding-top:10px;"><b><a href="<?php echo get_permalink($post->ID);?>"><?php echo $title;?></a></b></div><div align="left" style="height:18px; width:82px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars.png) left top no-repeat;"><div id="stars<?php echo $post->ID;?>" align="left" style="height:18px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars_glow.png) left top no-repeat;">
                  </div>
                  </div>

                  <script type="text/javascript">
                var width<?php echo $post->ID;?> = ((<?php
$Rating = get_post_meta($post->ID, "Rating", true);
echo $Rating;
?> * 20) + '%')
                  $('#stars<?php echo $post->ID;?>').css('width', width<?php echo $post->ID;?>);

                 </script><div class="textstandard_white" style="padding-top:6px; font-size:10px; color:#BBB; padding-bottom:10px; border-bottom:1px dotted #BBB; min-height:70px;"><div style="float:left; padding-right:6px; padding-bottom:6px;"><div style="background:#FFF; border:1px solid #FFF;
border-radius: 4px; -moz-border-radius: 4px ; -webkit-border-radius: 4px; padding:4px;"><a href="<?php echo get_permalink($post->ID);?>"><?php echo $thumb;?></a></div></div>



<?php echo $excerpt;?></div>
              <?php endforeach;?>
Robin I Knight
la source
en quoi consiste exactement "une partie" du contenu?
kaiser
La fonction d'extrait dans wordpress renvoie l'extrait d'un article. Si la publication n'a pas d'extrait, elle renvoie un certain nombre de caractères du contenu suivi de '...' ou 'en savoir plus' ou tout ce que le modèle fournit
Robin I Knight
1
Ne pas être un PITA mais les règles de la communauté interdisent les signatures et les fermetures standard. Afin de respecter les règles et d'éviter que Jeff Atwood ne vous envoie un message sévère après avoir édité toutes vos questions, veuillez cesser d'utiliser "Marvellous" comme clôture. (Et s'il vous plaît ne tirez pas sur le messager)
MikeSchinkel

Réponses:

20

Salut @Robin I. Knight:

Je considère get_the_excerpt()comme une fonction avec un design hérité. À mesure que l'utilisation de WordPress a augmenté, il existe de nombreux cas d'utilisation plus récents où cela ne convient pas, mais où les nouvelles fonctions pour obtenir des données différentes le font. Un exemple est l'utilisation désormais fréquente d'un $argstableau d'options de fonctions.

Mais il est facile de corriger vos besoins. Voici une fonction alternative que vous pouvez utiliser et que vous pouvez placer n'importe où dans le functions.phpfichier de votre thème :

function robins_get_the_excerpt($post_id) {
  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;
}

Je ne l'ai pas testé mais je suis sûr que je l'ai bien fait. Si cela ne répond pas à vos besoins, veuillez élaborer et je pourrai peut-être faire d'autres suggestions.

Mike Schinkel
la source
Ça marche. Sorte de. Des résultats très étranges. Il remplit certainement sa fonction mais les résultats sont étranges. Je l'utilise en conjonction avec GET_Posts et pour une raison quelconque, les 2 premiers messages get sont toujours les mêmes. Voici un lien et vous verrez ce que je veux dire. Regardez les 4 postes sur le côté droit. divethegap.com/update/community/feedback/2010/06/steve-riches
Robin I Knight
@Robin I Knight: veuillez publier le code source de votre boucle en tant que mise à jour de votre question; il est très difficile de déboguer du code sans voir le code. C'est peut-être aussi un plugin qui cause le problème; essayez de les désactiver un par un.
MikeSchinkel
Code source de la boucle en question ci-dessus ^^
Robin I Knight
BTW J'ai changé le nom de la fonction en get_the_excerpt_id ($ post_id)
Robin I Knight
@Robin I Knight - Je ne vois rien dans votre boucle, mais vous pourriez essayer d'appeler setup_postdata($post)au début de votre boucle, comme le suggère @Rarst. Si cela ne fonctionne pas, il peut s'agir d'un plugin que vous devez désactiver; as-tu essayé ça? Et vous ne voudrez probablement pas l'appeler get_the_excerpt_id()car WordPress pourrait ajouter cette fonction à l'avenir et casser votre site. Et vous pourriez probablement vous passer de la fonction dans votre boucle en utilisant à la foreach($stories as $story): global $post; $post = $story;place.
MikeSchinkel
16

La mécanique de l'extrait est extrêmement déroutante. Ce n'est pas une réponse précise à votre question, mais en général, si vous devez créer des balises de modèle, spécifiques à Loop, travaillez avec le tableau retourné par get_posts()vous pouvez émuler Loop comme ceci:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();
Rarst
la source
Qu'en est-il de wp_reset_query (); ?
cwd
1
@cwd si seule l'utilisation de setup_postdata()la requête globale n'est pas affectée et que seules les données de publication doivent être réinitialisées.
Rarst
Cette solution est beaucoup plus propre que de stocker le message dans une autre variable et de requérir un autre message juste pour le rendre global. +1
Barry Kooij
Merci @Rarst qui m'a aidé. Ajout de setup_postdata ($ post); résolu mes problèmes
Simon
8

Il existe une nouvelle fonction depuis la 3.3.0: wp_trim_words

Je l'utilise en dehors de la boucle comme suit:

 <?php if ( $post_id ) {
 $post = get_post( $post_id );
 if ( $post ) { ?>
     <h2><?php echo $post->post_title; ?></h2>
     <p><em><?php echo wp_trim_words( $post->post_content ); ?></em></p>
     <p><strong>This article can only be read by subscribers.</strong></p>
 <?php } } ?>

Cela ne doit pas être confondu avec wp_trim_excerpt qui ne fonctionne apparemment que dans la boucle, car il appelle the_content () en interne.

lkraav
la source
6

Juste pour ajouter à la réponse de MikeSchinkel, qui pour une raison quelconque ne fonctionnerait pas pour moi. J'ai dû ajouter la ligne setup_postdata pour que cela fonctionne.

function get_the_excerpt( $post_id ){

  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  setup_postdata( $post ); // hello
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;

}

Je suppose que si vous utilisez cela en dehors de la boucle, cela ne devrait pas interférer avec les autres setup_postdata en cours.

À votre santé

danbrown
la source
J'ai essayé la réponse de MikeSchinkel et cela n'a pas fonctionné pour moi. La configuration des données de publication a fait l'affaire. Dans mon cas, sans 'setup_postdata', la fonction a renvoyé le titre + l'extrait du message parent.
turzifer
2

S'appuyant sur la réponse de @ Maxime, cela fonctionnerait-il?

$post = get_post( $id );

$excerpt = ( $post->post_excerpt ) ? $post->post_excerpt : $post->post_content;

Cela me semble assez simple, mais je me demande si je manque quelque chose.

Dominic P
la source
1

Si TOUS vos messages ont la <!--more-->balise, vous pouvez utiliser ce qui suit avec votre code ci-dessus:

$sjc_excerpt = explode( '<!--more-->', $post->post_content); 
echo wpautop( $sjc_excerpt[0] );

Bien sûr, si vous avez des articles qui n'ont pas de <!--more-->balise, ils seront affichés dans leur intégralité. Fonctionne dans ma situation, mais pas pour tous ...

Stephen Cronin
la source
1

Je considère get_the_excerpt()comme une fonction avec un design hérité. À mesure que l'utilisation de WordPress a augmenté, il existe de nombreux cas d'utilisation plus récents où cela ne convient pas, mais où les nouvelles fonctions pour obtenir des données différentes le font. Un exemple est l'utilisation désormais fréquente d'un $argstableau d'options de fonctions.

Mais il est facile de corriger vos besoins. Voici une fonction alternative que vous pouvez utiliser et que vous pouvez placer n'importe où dans le functions.phpfichier de votre thème :

function robins_get_the_excerpt($post_id) {
   global $post;  
   $save_post = $post;
   $post = get_post($post_id);
   $output = get_the_excerpt();
   $post = $save_post;
   return $output;
}

Juste pour ajouter à la réponse de MikeSchinkel, qui pour une raison quelconque ne fonctionnerait pas pour moi. J'ai dû ajouter la ligne setup_postdata pour que cela fonctionne.

Jude
la source
Est-ce que cela doit wp_reset_post_data()fonctionner à l'intérieur de la boucle?
Chris Pink
Apparemment (après avoir fait le tour de cette maison particulière), cela fait maintenant partie du noyau.
Chris Pink
0

Ceci est un petit deux lignes que j'utilise beaucoup en utilisant wp_trim_words . Je me retrouve constamment à avoir besoin de l'abréviation et de lire plus de fonctionnalités en dehors de la boucle. Quelqu'un d'autre peut trouver cela utile. Voici donc ce que j'utilise pour:

  1. Obtenez l'extrait par ID POST
  2. Obtenir le contenu de la publication Si aucun extrait n'a été défini,
  3. Définir la longueur de mot de l'extrait
  4. Choisissez le contenu pour la suite (lien / texte)

Je mets cela en ligne, directement dans le modèle personnalisé que je modifie.

    //Get Post Object
    $dapost = get_post(POST_ID);              
    //Get the Execerpt
    $my_excerpt = wp_trim_words( apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content  ), "20", "<a href='$dapost->guid'> ".__('Get More Stuff', 'translation')."</a>" );

Panne

1.Le contenu de l'extrait

Obtenez l'extrait par ID de publication, mais obtenez le contenu de la publication si aucun extrait n'a été défini.

J'utilise le raccourci If / Else PHP .

    $dapost = get_post(POST_ID);    
    apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content

2. Longueur du mot

Définissez le nombre de mots dans l'extrait sur 20

    "20"

3. Choisissez le contenu ReadMore (lien / texte)

   "<a href='$dapost->guid'> ".__('Get More Stuff', 'translation')."</a>"

J'avais l'habitude $dapost->guidd'obtenir l'URL, car je n'avais pas besoin d'URL conviviales et je voulais éviter un autre appel à la base de données. Vous pouvez toujours utiliser get_the_permalink.

Voir wp_trim_words dans la documentation Wordpress.

Brev Tiw
la source
0

Cela a fonctionné pour moi:

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));
Rijo KP
la source
-2

C'est plus rapide:

global $post;
return get_post($post_id)->post_excerpt;
Maxime Kieffer
la source
1
Pas quand l'extrait est vide… comme mentionné dans la question.
fuxia
En effet pas quand un except est généré automatiquement
Joshc
Dévoté car cela n'est pas utile
Pieter Goosen