如何将操作the_post应用于仅主要显示的帖子

时间:2014-06-23 作者:Konstantin Bodnia

我正试图写一个动作,修改WooCommerce显示器上的一些产品。

这是我的简单代码

function do_some_modifications($post)
{
    if (is_singular(\'product\')) {
        // do some action
    }
    return $post;
}
add_action(\'the_post\', \'do_some_modifications\');
但该页面包含两个相关产品,并且也会为它们调用“the\\u post”。如何避免对主产品页上显示的其他产品运行该代码?

非常感谢。

5 个回复
最合适的回答,由SO网友:Konstantin Bodnia 整理而成

可以开始了!

我只需要在一个插件中实现,而不是在模板中实现。

所以我找到了如何在循环外获取当前帖子的ID。伟大的功能get_queried_object()get_queried_object_id() 将达成交易!

这似乎不是最快的方式(它查询数据库),但在我的情况下,这是一个完美的解决方案,因为我并不是在每个页面上运行此代码,也不是每次加载时都运行此代码。

最后的代码是

function do_some_modifications($post)
{
    if (is_singular(\'product\') and get_queried_object_id() == $post->ID) {
        // do some action
    }
    return $post;
}
add_action(\'the_post\', \'do_some_modifications\');

SO网友:Vasu Chawla

代替

    if (is_singular(\'product\')){
      //  do some action
    }
使用

    if (is_singular(\'product\') && is_main_query()){
      //  do some action
    }

SO网友:Rarst

实现它的最简单方法是在模板的主循环之前添加回调,然后删除。然而,从模板的角度来看,不是太整洁。

如果只使用挂钩,您可能需要检查是否存在帖子$wp_query->posts, 然而,这将在复制品上失火。

在过去,我记得这样做是通过将自定义标记属性添加到post对象,但那是在以前WP_Post 课程已经引入,我不确定它是否是可行的技术。

SO网友:Jonas Lundman

在这个场景中,对于这个堆栈问题,内置的魔法in_the_loop() 为我做这项工作:

function do_some_modifications($post){
    if(is_singular(\'product\') && in_the_loop()) {
        // do some action
    }
}
add_action(\'the_post\', \'do_some_modifications\');
您可以跳过return $post 随着这一行动的进行$post 通过引用。

我认为do_action(\'the_post\') 就是这样,不要在插入模板操作上吹毛求疵,尤其不是woocommerce,他们有所有的模板,并且一直在更改它们。

我也遇到过类似的情况,我的官方插件应该在调用共享模板之前完成一些事情。在这里I dont know in advanced what template the Theme would use, 所以我需要的和这个案子一样,target the archive product listing, 但是not related product listings below 或其他可能使用相同模板的小部件。

如果其他资源对此进行了配置,只针对侧边栏,则以相反的方式设置条件!in_the_loop() 您可能需要检查$post 在你做事之前

SO网友:Philipp

我能想到的最简单、最可靠的方法是使用the_post 措施:

function do_some_modifications( $post, $query ) {
    if ( $query->is_main_query() && $query->is_singular( \'product\' ) ) {
        // do some action
    }
}
add_action( \'the_post\', \'do_some_modifications\', 10, 2 );
一些注意事项:

second parameter 过滤器回调的WP_Query 当前正在处理的对象。

还有,the_post 是一个动作,因此not need a return value. 您可以直接修改$post变量(它是对WordPress使用的实际对象的引用),而不是返回$post值

使用该功能时is_singular() 它将始终检查主WP\\U查询对象。如果要检查当前由处理的查询the_post 那么你需要使用$query->is_singular().

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $