9

作为 WooCommerce 网站的一部分,我希望有一个列出销售项目的销售页面(带有分页和过滤)。我认为最好的方法是让“销售”类别自动添加到属于销售的任何帖子中(因为类别页面允许自动过滤和分页。

到目前为止,我有这段代码可以在您保存产品时以编程方式将销售类别添加到产品中:

function update_test( $product) { 
wp_set_object_terms($product, 'sale', 'product_cat', true );
}

add_action( 'save_post', 'update_test', 1, 2);`

但是,我只希望在产品打折时发生这种情况(即设置了销售价格),以便保存非打折的帖子不会添加销售类别。我尝试了几种不同的方法,但都没有运气。我试过这个,但它没有用:

function update_test( $product ) { 
if($product->is_on_sale()){
wp_set_object_terms($product, 'sale', 'product_cat', true );
}
}

add_action( 'save_post', 'update_test', 1, 2);`

但这只是让我的网站在保存时冻结。

有任何想法吗?

安迪

4

2 回答 2

5

更新 2 (2018 年 10 月)

save_post是一个 WordPress 钩子,适用于$post_id参数并针对所有类型的帖子。您需要首先在条件(和)中定位product自定义 WooCommerce 。post_typepublish post_status

此外,由于它不是 post 对象,因此您不能is_on_sale()对它使用方法。但是您可以使用get_post_meta()功能检查产品中是否设置了销售价格

这是功能齐全且经过测试的代码仅适用于简单产品

add_action( 'save_post_product', 'update_product_set_sale_cat' );
function update_product_set_sale_cat( $post_id ) {
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return $post_id;
    }

    if ( ! current_user_can( 'edit_product', $post_id ) ) {
        return $post_id;
    }

    if( get_post_status( $post_id ) == 'publish' && isset($_POST['_sale_price']) ) {
        $sale_price = $_POST['_sale_price'];

        if( $sale_price >= 0 && ! has_term( 'Sale', 'product_cat', $post_id ) ){
            wp_set_object_terms($post_id, 'sale', 'product_cat', true );
        }
    }
}

代码位于您的活动子主题(或活动主题)的 function.php 文件中。测试和工作。

相关:从 Woocommerce 中的非销售产品中自动删除销售产品类别

于 2016-12-05T01:54:09.070 回答
0

我认为这样做的更方便的方法,也适用于变量 products,将在子主题的 function.php 中添加以下内容(或通过插件等):

add_action( 'woocommerce_update_product', 'update_product_set_sale_cat', 10, 2 );

function update_product_set_sale_cat( $product_id, $product ) {
    if ( $product->is_on_sale() ) {
        wp_add_object_terms($product_id, "sale", 'product_cat');
    } else { // this will also remove the sale category when the product in no longer on sale
        wp_remove_object_terms($product_id, "sale", 'product_cat');
    }
}

它使用woocommerce_update_product在数据库中更新/创建产品时运行的钩子。

于 2022-02-07T17:12:50.570 回答