web-dev-qa-db-fra.com

Comment filtrer get_the_excerpt () mais garder toutes ses fonctionnalités intactes?

J'ai un champ méta personnalisé que je veux afficher comme extrait. J'utilise un filtre qui fait ça pour moi:

add_filter( 'get_the_excerpt', function($output){
  $output=get_post_meta(get_the_ID(), 'my_meta_field', true);
  return $output;
});

Maintenant, chaque fois que j'utilise get_the_excerpt() ou the_excerpt() à l'intérieur de la boucle, j'obtiens le contenu de my_meta_field.

Mais depuis WP 4.5.0 get_the_excerpt() accepte un objet Post ID ou WP_Post en tant que paramètre. Je voudrais garder cette fonctionnalité intacte tout en utilisant mon filtre.

Alors, imaginez que je veuille utiliser get_the_excerpt() en dehors de la boucle. Lorsque j'appelle get_the_excerpt(1234) (1234 étant l'ID d'un message), le mauvais extrait me est renvoyé car la fonction get_the_ID() de mon filtre saisit tout ce que global $post doit offrir à ce moment.

Quel est le moyen le plus élégant/efficace de résoudre ce problème? Puis-je utiliser l'identifiant que je transmets pour obtenir get_the_excerpt à l'intérieur de mon filtre? Ou dois-je créer une mini-boucle et définir global $post sur get_post(1234)?

3
Florian

Malgré ce que dit le Codex, depuis WP 4.5, où l'ajout de l'argument post à la fonction get_the_excerpt a été ajouté, ce filtre prend deux arguments. Le deuxième argument est l'objet post dont vous manipulez l'extrait.

Donc, la fonction fonctionne toujours dans la boucle sans publication explicite, nous rendons le second argument facultatif.

add_filter( 'get_the_excerpt', 'wpse_242462_excerpt_filter' );

function wpse_242462_excerpt_filter( $excerpt, $post = null ){

      if ( $post ) {
        $ID = $post->ID;
      } else {
        $ID = get_the_ID();
      }

      $excerpt = get_post_meta( $ID, 'wpse_242462_meta_field', true);

      return $excerpt;
});

Espérons qu'il va sans dire que vous devez remplacer la méta-clé que vous utilisez déjà.

2

Même si vous n'êtes pas au courant, si vous êtes dans un message ou une page (ou un autre type de message) généré à partir de WordPress, $ post sera défini. Donc, si vous remplacez simplement get_the_ID() dans votre fonction ci-dessus par $post->ID, cela fonctionnera. Si vous avez déjà exécuté d'autres requêtes sur la page, vous devrez peut-être exécuter wp_reset_query(); pour obtenir l'identifiant de publication réel.

Si vous souhaitez transmettre un message spécifique, vous devez séparer la fonction de l'appel add_filter le long des lignes suivantes:

// function to pass the ID to
function my_meta_excerpt($postID){
  $output=get_post_meta($postID, 'my_meta_field', true);
  return $output;
}
// add filter call
add_filter( 'get_the_excerpt', my_meta_excerpt);
0
Jonny Perl