我正在尝试开发一个插件来扩展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
}
}
最合适的回答,由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/