Как часть сайта 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);`
но это только заставило мой сайт заморозить при сохранении.
Есть идеи?
Энди
Обновлено 2 (Октябрь 2018 г.)
save_post
это хук WordPress, который работает с $post_id
аргумент и цель все виды сообщений. Вы должны нацелиться product
пользовательские WooCommerce post_type
сначала в состоянии (и publish
post_status
).
Кроме того, поскольку это не почтовый объект, вы не можете использовать 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
Других решений пока нет …