根据自定义管理复选框的条件更改商店档案中的“添加到购物车”按钮
Change Add To Cart button on shop archives based on condition of custom admin checkbox
我创建了一个自定义管理产品复选框,如果此复选框处于活动状态,我想将任何商店 archive/category 页面上这些产品的 'Add To Cart' 按钮替换为 'View Product'并且该按钮应将查看者带到产品页面。
其他没有激活复选框的商店物品应该正常运行并显示 'Add To Cart' 按钮并保留其功能。
我的复选框在管理员端工作,使用以下代码没有问题:
// Display Checkbox
add_action('woocommerce_product_options_general_product_data', 'product_custom_fields_add');
function product_custom_fields_add(){
global $post;
echo '<div class="product_custom_field">';
// Custom Product Checkbox Field
woocommerce_wp_checkbox( array(
'id' => '_no_addcart_product',
'desc' => __('show or hide add to cart', 'woocommerce'),
'label' => __('Hide Add To Cart', 'woocommerce'),
'desc_tip' => 'true'
));
echo '</div>';
}
// Save Checkbox
add_action('woocommerce_process_product_meta', 'product_custom_fields_save');
function product_custom_fields_save($post_id){
// Custom Product Text Field
$no_addcart_product = isset( $_POST['_no_addcart_product'] ) ? 'yes' : 'no';
update_post_meta($post_id, '_no_addcart_product', esc_attr( $no_addcart_product ));
}
我想出了下面这段代码,尝试根据复选框状态添加 if 条件。
add_filter( 'woocommerce_loop_add_to_cart_link', 'replacing_add_to_cart_button', 10, 2 );
function replacing_add_to_cart_button( $button, $product ) {
if ( $product->get_meta('_no_addcart_product') === 'yes' )
$button_text = __("View product", "woocommerce");
$button = '<a class="button" href="'. $product->get_permalink().'">' . $button_text.'</a>';
return $button;
}
它部分用于更改按钮文本和 link 任何已正确激活复选框的产品。然而,问题是它还会从所有其他商店商品中删除文本,并为任何没有激活复选框的商品留下一个空白按钮(见下图)。这些产品的 link 也更改为产品页面,而不是我希望它们保留的 'Add To Cart'。
我已经阅读了很多线程,这些线程可以全局更改所有产品的按钮,但无法找到任何仅适用于某些产品的条件逻辑可以帮助我解决这个问题。因此,我们将不胜感激任何帮助。非常感谢。
已更新
您上一个函数代码中的问题与您的 IF
语句有关,该语句需要 brackets:
add_filter( 'woocommerce_loop_add_to_cart_link', 'replacing_add_to_cart_button', 10, 2 );
function replacing_add_to_cart_button( $button, $product ) {
if ( $product->get_meta('_no_addcart_product') === 'yes' ) {
$button_text = __("View product", "woocommerce");
$button = '<a class="button" href="'. $product->get_permalink().'">' . $button_text.'</a>';
}
return $button;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。现在应该可以使用了。
我创建了一个自定义管理产品复选框,如果此复选框处于活动状态,我想将任何商店 archive/category 页面上这些产品的 'Add To Cart' 按钮替换为 'View Product'并且该按钮应将查看者带到产品页面。
其他没有激活复选框的商店物品应该正常运行并显示 'Add To Cart' 按钮并保留其功能。
我的复选框在管理员端工作,使用以下代码没有问题:
// Display Checkbox
add_action('woocommerce_product_options_general_product_data', 'product_custom_fields_add');
function product_custom_fields_add(){
global $post;
echo '<div class="product_custom_field">';
// Custom Product Checkbox Field
woocommerce_wp_checkbox( array(
'id' => '_no_addcart_product',
'desc' => __('show or hide add to cart', 'woocommerce'),
'label' => __('Hide Add To Cart', 'woocommerce'),
'desc_tip' => 'true'
));
echo '</div>';
}
// Save Checkbox
add_action('woocommerce_process_product_meta', 'product_custom_fields_save');
function product_custom_fields_save($post_id){
// Custom Product Text Field
$no_addcart_product = isset( $_POST['_no_addcart_product'] ) ? 'yes' : 'no';
update_post_meta($post_id, '_no_addcart_product', esc_attr( $no_addcart_product ));
}
我想出了下面这段代码,尝试根据复选框状态添加 if 条件。
add_filter( 'woocommerce_loop_add_to_cart_link', 'replacing_add_to_cart_button', 10, 2 );
function replacing_add_to_cart_button( $button, $product ) {
if ( $product->get_meta('_no_addcart_product') === 'yes' )
$button_text = __("View product", "woocommerce");
$button = '<a class="button" href="'. $product->get_permalink().'">' . $button_text.'</a>';
return $button;
}
它部分用于更改按钮文本和 link 任何已正确激活复选框的产品。然而,问题是它还会从所有其他商店商品中删除文本,并为任何没有激活复选框的商品留下一个空白按钮(见下图)。这些产品的 link 也更改为产品页面,而不是我希望它们保留的 'Add To Cart'。
我已经阅读了很多线程,这些线程可以全局更改所有产品的按钮,但无法找到任何仅适用于某些产品的条件逻辑可以帮助我解决这个问题。因此,我们将不胜感激任何帮助。非常感谢。
已更新
您上一个函数代码中的问题与您的 IF
语句有关,该语句需要 brackets:
add_filter( 'woocommerce_loop_add_to_cart_link', 'replacing_add_to_cart_button', 10, 2 );
function replacing_add_to_cart_button( $button, $product ) {
if ( $product->get_meta('_no_addcart_product') === 'yes' ) {
$button_text = __("View product", "woocommerce");
$button = '<a class="button" href="'. $product->get_permalink().'">' . $button_text.'</a>';
}
return $button;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。现在应该可以使用了。