如何在过滤get_the_excerpt()的同时保持其所有功能不变?

时间:2016-10-12 作者:Florian

我有一个自定义的元字段,我想显示为我的摘录。我使用的过滤器可以为我做到这一点:

add_filter( \'get_the_excerpt\', function($output){
  $output=get_post_meta(get_the_ID(), \'my_meta_field\', true);
  return $output;
});
现在每当我使用get_the_excerpt()the_excerpt() 在循环内部,我得到my_meta_field.

但自WP 4.5.0以来get_the_excerpt() 接受Post ID或WP\\U Post对象作为参数。我希望在使用过滤器时保持此功能不变。

想象一下我想用get_the_excerpt() 循环外部。当我打电话时get_the_excerpt(1234) (1234是帖子的ID)我得到了错误的摘录,因为get_the_ID() 在我的过滤器里global $post 必须在那一刻提供。

解决这个问题最优雅/有效的方法是什么?我是否可以使用我传递的ID在筛选器中获取\\u摘录?或者我需要创建一个小循环并设置global $postget_post(1234)?

2 个回复
SO网友:Andy Macaulay-Brook

不管《Codex》怎么说,由于WP 4.5在函数get\\u the\\u摘录中添加了post参数,因此该过滤器采用了两个参数。第二个参数是正在处理其摘录的post对象。

因此,该函数仍然在没有显式post的循环中工作,我们将第二个参数设置为可选。

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;
});
希望不用说,您需要替换您已经使用的任何元键。

SO网友:Jonny Perl

即使您不在循环中,如果您在WordPress生成的帖子或页面(或其他帖子类型)中,也会设置$post。所以如果你只是更换get_the_ID() 在上述功能中$post->ID, 它会起作用的。如果您一直在该页面上运行其他查询,则可能需要运行wp_reset_query(); 获取实际的职位ID。

如果要传递特定的post,需要按照以下行将函数与add\\u filter调用分开:

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

相关推荐

是否清空_excerpt()中断了他下面的_perMalink()?

我有个问题。是的<?php the_excerpt(); ?> 从古腾堡清空<?php the_excerpt(); ?> 从帖子中提取一小部分内容,但先下一步<?php the_permalink(); ?> 下是断开的,并更改了从单个博客到博客帖子列表根目录的路径。如何解决这个问题?E、 回路g:<?php $paged = ( get_query_var( \'paged\' ) ) ? get_query_var