为最新的 WooCommerce 产品设置客体条款并删除旧产品的客体条款
Set object terms for latest WooCommerce products and remove object terms for older ones
我想在某个类别中设置最近上传的32个产品。
该功能有效,但它不会在上传新产品时从旧产品中删除类别。
代码如下:
function add_category_to_product()
{
$args = array(
'post_type' => 'product',
'posts_per_page' => 32
);
$products = new WP_Query($args);
$foundposts = $products->post_count;
if ($products->have_posts()) {
while ($products->have_posts()) {
$products->the_post();
if ($foundposts <= 32 && has_term(array(86, 87, 88, 89, 90, 91, 92, 93, 83, 94, 95, 96, 84, 98, 99, 100, 101, 102, 103, 80), 'product_cat', get_the_ID())) {
wp_set_object_terms(get_the_ID(), 79, 'product_cat', true);
} elseif ($foundposts <= 32 && has_term(array(51, 52, 53, 54, 55, 56, 57, 58, 43, 60, 61, 62, 63, 45, 64, 65, 66, 67, 68, 69, 70, 48, 71, 72, 73, 74, 75, 76, 77, 78, 44, 49), 'product_cat', get_the_ID())) {
wp_set_object_terms(get_the_ID(), 40, 'product_cat', true);
} elseif ($foundposts <= 32 && has_term(array(128, 129, 130, 131, 132, 114, 115, 133, 134, 135, 136, 117, 118, 119, 137, 138, 139, 140), 'product_cat', get_the_ID())) {
wp_set_object_terms(get_the_ID(), 112, 'product_cat', true);
} elseif ($foundposts <= 32 && has_term(array(141, 142, 143, 144, 145, 146, 125, 147, 148, 149, 150), 'product_cat', get_the_ID())) {
wp_set_object_terms(get_the_ID(), 122, 'product_cat', true);
} else {
wp_remove_object_terms(get_the_ID(), 112, 'product_cat');
wp_remove_object_terms(get_the_ID(), 122, 'product_cat');
wp_remove_object_terms(get_the_ID(), 40, 'product_cat');
wp_remove_object_terms(get_the_ID(), 79, 'product_cat');
}
}
wp_reset_postdata();
}
}
也许有人能看出我的错误?
你的错误:
你使用 'posts_per_page' => 32
并提到 'and for the other products',而 else 条件在这 32 个当前产品的循环中...
解决方法:
-
由于您实际上想要对所有产品应用更改(除非您定期执行此功能),仅对最后 32 个产品应用是不够的。所以使用 limit
,它接受一个整数:要检索的最大结果数或 -1
表示无限制。
orderby
- 接受字符串:'none'、'ID'、'name'、'type'、'rand'、 'date', 'modified'.
order
- 接受字符串:'DESC' 或 'ASC'。与 orderby
.
一起使用
return
- 接受字符串:ids
或 objects.
因为我们只需要针对产品对象的 productID,所以 ids
就足够了。
注意:这种修改产品的方式在涉及的产品不多的情况下比较有效。如果不是,那么 sql 查询是一个更有效的解决方案。
使用的 WordPress 函数:
所以你得到:
// For x number of last products
$last_products = 32;
// Args
$args = array(
'limit' => -1,
'orderby' => 'date',
'order' => 'DESC',
'return' => 'ids',
);
// Get product IDs
$product_ids = wc_get_products( $args );
// Loop through
foreach( $product_ids as $key => $product_id ) {
if ( ( $key + 1 ) <= $last_products ) {
if ( has_term( array( 80, 86, 87, 88, 89, 90, 91, 92, 93, 83, 94, 95, 96, 84, 98, 99, 100, 101, 102, 103 ), 'product_cat', $product_id ) ) {
wp_set_object_terms( $product_id, 79, 'product_cat', true );
} elseif ( has_term( array( 44, 49, 51, 52, 53, 54, 55, 56, 57, 58, 43, 60, 61, 62, 63, 45, 64, 65, 66, 67, 68, 69, 70, 48, 71, 72, 73, 74, 75, 76, 77, 78 ), 'product_cat', $product_id ) ) {
wp_set_object_terms( $product_id, 40, 'product_cat', true );
} // etc..
} else {
if ( has_term( array ( 40, 79, 112, 122 ), 'product_cat', $product_id ) ) {
wp_remove_object_terms( $product_id, 40, 'product_cat', true );
wp_remove_object_terms( $product_id, 79, 'product_cat', true );
wp_remove_object_terms( $product_id, 112, 'product_cat', true );
wp_remove_object_terms( $product_id, 122, 'product_cat', true );
}
}
}
我想在某个类别中设置最近上传的32个产品。
该功能有效,但它不会在上传新产品时从旧产品中删除类别。
代码如下:
function add_category_to_product()
{
$args = array(
'post_type' => 'product',
'posts_per_page' => 32
);
$products = new WP_Query($args);
$foundposts = $products->post_count;
if ($products->have_posts()) {
while ($products->have_posts()) {
$products->the_post();
if ($foundposts <= 32 && has_term(array(86, 87, 88, 89, 90, 91, 92, 93, 83, 94, 95, 96, 84, 98, 99, 100, 101, 102, 103, 80), 'product_cat', get_the_ID())) {
wp_set_object_terms(get_the_ID(), 79, 'product_cat', true);
} elseif ($foundposts <= 32 && has_term(array(51, 52, 53, 54, 55, 56, 57, 58, 43, 60, 61, 62, 63, 45, 64, 65, 66, 67, 68, 69, 70, 48, 71, 72, 73, 74, 75, 76, 77, 78, 44, 49), 'product_cat', get_the_ID())) {
wp_set_object_terms(get_the_ID(), 40, 'product_cat', true);
} elseif ($foundposts <= 32 && has_term(array(128, 129, 130, 131, 132, 114, 115, 133, 134, 135, 136, 117, 118, 119, 137, 138, 139, 140), 'product_cat', get_the_ID())) {
wp_set_object_terms(get_the_ID(), 112, 'product_cat', true);
} elseif ($foundposts <= 32 && has_term(array(141, 142, 143, 144, 145, 146, 125, 147, 148, 149, 150), 'product_cat', get_the_ID())) {
wp_set_object_terms(get_the_ID(), 122, 'product_cat', true);
} else {
wp_remove_object_terms(get_the_ID(), 112, 'product_cat');
wp_remove_object_terms(get_the_ID(), 122, 'product_cat');
wp_remove_object_terms(get_the_ID(), 40, 'product_cat');
wp_remove_object_terms(get_the_ID(), 79, 'product_cat');
}
}
wp_reset_postdata();
}
}
也许有人能看出我的错误?
你的错误:
你使用 'posts_per_page' => 32
并提到 'and for the other products',而 else 条件在这 32 个当前产品的循环中...
解决方法:
由于您实际上想要对所有产品应用更改(除非您定期执行此功能),仅对最后 32 个产品应用是不够的。所以使用
limit
,它接受一个整数:要检索的最大结果数或-1
表示无限制。orderby
- 接受字符串:'none'、'ID'、'name'、'type'、'rand'、 'date', 'modified'.
一起使用order
- 接受字符串:'DESC' 或 'ASC'。与orderby
.return
- 接受字符串:ids
或objects.
因为我们只需要针对产品对象的 productID,所以ids
就足够了。注意:这种修改产品的方式在涉及的产品不多的情况下比较有效。如果不是,那么 sql 查询是一个更有效的解决方案。
使用的 WordPress 函数:
所以你得到:
// For x number of last products
$last_products = 32;
// Args
$args = array(
'limit' => -1,
'orderby' => 'date',
'order' => 'DESC',
'return' => 'ids',
);
// Get product IDs
$product_ids = wc_get_products( $args );
// Loop through
foreach( $product_ids as $key => $product_id ) {
if ( ( $key + 1 ) <= $last_products ) {
if ( has_term( array( 80, 86, 87, 88, 89, 90, 91, 92, 93, 83, 94, 95, 96, 84, 98, 99, 100, 101, 102, 103 ), 'product_cat', $product_id ) ) {
wp_set_object_terms( $product_id, 79, 'product_cat', true );
} elseif ( has_term( array( 44, 49, 51, 52, 53, 54, 55, 56, 57, 58, 43, 60, 61, 62, 63, 45, 64, 65, 66, 67, 68, 69, 70, 48, 71, 72, 73, 74, 75, 76, 77, 78 ), 'product_cat', $product_id ) ) {
wp_set_object_terms( $product_id, 40, 'product_cat', true );
} // etc..
} else {
if ( has_term( array ( 40, 79, 112, 122 ), 'product_cat', $product_id ) ) {
wp_remove_object_terms( $product_id, 40, 'product_cat', true );
wp_remove_object_terms( $product_id, 79, 'product_cat', true );
wp_remove_object_terms( $product_id, 112, 'product_cat', true );
wp_remove_object_terms( $product_id, 122, 'product_cat', true );
}
}
}