WooCommerce:移除商品作者登录时的加入购物车按钮并添加编辑链接
嘿,我看你在WooCommerce商品列表里自定义作者专属操作的时候踩坑了——功能没生效还搞崩了布局,这事儿我之前也碰到过,咱们一步步来修:
先分析你遇到的问题根源
- 过时函数导致的上下文错误:你用的
get_currentuserinfo()在WordPress 4.5之后就被弃用了,这会导致用户信息获取异常,判断条件失效,所以第一个商品还显示加购按钮。 - 钩子优先级/写法错误:你写的
remove_action代码没写完(1...),而且直接在循环外操作钩子,很容易打断商品循环的HTML结构,导致只有部分商品显示。 - 循环上下文丢失:没有在正确的钩子回调里处理商品数据,导致
$post变量的上下文不对,判断逻辑失效。
修正后的完整代码
把这段代码放到你的主题functions.php里,或者自定义插件中:
add_action('woocommerce_after_shop_loop_item', 'custom_author_product_actions', 5); function custom_author_product_actions() { global $post; $current_user = wp_get_current_user(); // 替换过时的get_currentuserinfo() // 验证:用户已登录,且是当前商品的作者 if (is_user_logged_in() && $current_user->ID === $post->post_author) { // 移除默认的加入购物车按钮(原钩子优先级是10,要和它一致才能移除成功) remove_action('woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10); // 添加自定义的编辑商品链接 echo '<a href="' . esc_url(get_edit_post_link($post->ID)) . '" class="button wc-product-edit-btn">编辑我的商品</a>'; } }
关键细节说明
- 钩子优先级:我们把自定义回调的优先级设为5,比加购按钮的优先级10高,这样能确保在加购按钮输出前就执行移除操作。
- 安全处理:用
esc_url()处理编辑链接,避免XSS风险,这是WordPress开发的最佳实践。 - 上下文正确:在
woocommerce_after_shop_loop_item钩子的回调里处理,确保每个商品循环时都能正确获取当前的$post和用户信息。
额外调试技巧
如果还是有问题,你可以临时加调试代码确认逻辑:
// 在回调里加这行,看用户ID和商品作者ID是否匹配 var_dump('用户ID:'.$current_user->ID, '商品作者ID:'.$post->post_author);
开启WordPress的WP_DEBUG模式(在wp-config.php里设define('WP_DEBUG', true);),看看有没有报错,这能快速定位钩子冲突或变量错误。
内容的提问来源于stack exchange,提问作者oyshiu
相关产品推荐
相关产品推荐

