Hook在WooCommerce单一产品页面中触发了两次

时间:2016-04-07 作者:jlad26

我正在尝试开发一个插件来扩展WooCommerce,当我登录到单个产品页面时,我想对产品id做一些事情(例如,将其存储在数据库中或存储在会话变量中)。

然而,无论我尝试使用什么样的钩子,都给出了两个结果。因此,例如,我可以使用hook woocommerce\\u single\\u product\\u摘要,如下所示:

add_action( \'woocommerce_single_product_summary\', \'do_my_thing\' );
function do_my_thing() {
    global $post;
    store_the_id( $post->ID ); //some function to do something with the id
}
当用户登录到产品页面时,钩子被触发两次,函数store\\u my\\u id运行两次,并使用两个不同的post id。第一个是问题产品的正确id,第二个是其他产品的id。

无论我使用什么钩子,都会发生这种情况,例如get\\u header。如果我只想向页面回显一些内容,这不会有问题,因为回显只在挂钩第一次触发时输出。

谁能向我解释一下这里发生了什么事?这应该会发生吗?如果是这样的话,我是否可以通过某种方式区分返回的两个id,以知道哪个id实际上是我刚刚登录的产品的id?

我在一个全新的Wordpress上尝试了这个,只安装了WooCommerce插件,添加了215个主题和2个产品,所以我不认为这是由我正在做的任何自定义操作造成的。

非常感谢您的帮助。。。

EDIT

我想知道使用get\\u queryed\\u对象是否会有所帮助(如下所示),但同样的情况也会发生

add_action( \'woocommerce_single_product_summary\', \'do_my_thing\' );
function do_my_thing() {
    $queried_object = get_queried_object();
    if ( $queried_object->post_type == \'product\' ) {
        store_the_id( $queried_object->ID ); //some function to do something with the id
    }
}

2 个回复
最合适的回答,由SO网友:jlad26 整理而成

我认为是分页导致了这个问题。不确定这是WooCommerce bug还是故意的,但默认情况下,在单个产品页面上会向下一个产品添加一个关系链接。(我不明白为什么会这样,因为我本以为应该只展示一种产品,但我可能遗漏了一些东西。)

因此,这意味着下一个立柱正在加载并发射所有标准挂钩。

目前我正在使用next_post_rel_link 过滤器(和previous_post_rel_link 以防万一)按照以下步骤解决问题。我不认为这会有任何负面影响,但如果有,我会更新。。。

add_filter( \'next_post_rel_link\', \'jlad_remove_pagination_rel_link\' );
//may not be an issue for previous posts but just in case
add_filter( \'previous_post_rel_link\', \'jlad_remove_pagination_rel_link\' ); 

function jlad_remove_pagination_rel_link($link) {
    global $post;
    //check this is a product so we don\'t mess with pagination elsewhere
    if ( $post->post_type == \'product\' ) $link = \'\';
    return $link;
}
EDIT更多的研究让我认为这只是Firefox的预取问题——基于此http://www.cre8d-design.com/2010/10/wordpress-relnext-causes-issues-in-firefox/

SO网友:Mark Kaplun

您需要将自己限制在主循环中,这可以通过检查is_main_query 返回true。

这可能还不够,因为钩子/过滤器的设计可能是为了增加summary,因此即使在主循环本身执行期间,也可能会被多次调用。你有两个选择

使用更好的钩子。钩子名称听起来不像是应该触发任何DB写入的内容。

致电remove_filter 在第一次迭代完成后删除它。

相关推荐

OOP development and hooks

我目前正在为Wordpress编写我的第一个OOP插件。为了帮助我找到一点结构,a boiler plate 这为我奠定了基础。在里面Main.php 有一种方法可以为管理员加载JS和CSS资产:/** * Register all of the hooks related to the admin area functionality * of the plugin. * * @since 0.1.0 * @access private