#php #wordpress #woocommerce
Вопрос:
Я постараюсь объяснить, какова моя цель и что я уже сделал.
Я импортирую кучу продуктов в WooCommerce, но теперь я хотел бы добавить функцию, которая автоматически устанавливает категорию продуктов на «НОВЫЙ», если срок действия продукта не превышает 60 дней. По истечении 60 дней он должен быть снова выведен из этой категории.
Следует сказать, что я нахожусь в процессе изучения php с помощью WordPress и WooCommerce, поэтому мне жаль, если я не знаю определенных вещей.
function add_product_to_new_in() { global $product; // Get the date for the product published and current date $start = date('n/h/Y', strtotime($product-gt;get_date_created())); $today = date('n/j/Y'); // Get the date for the start of the event and today's date $start = new DateTime($start); $end = new DateTime($today); //FInd the difference $difference = $start-gt;diff($end); $days = $difference-gt;d; // If the difference is less than 60, apply "NEW IN cat" if ($days = (60 lt; $days)) { wp_set_object_terms($product, 40, 'product_cat'); } }
Если вы можете мне чем-нибудь помочь, я был бы вам очень признателен!
Ответ №1:
Вы можете сделать это на init
крючке, который срабатывает каждый раз при загрузке страницы.
Во-первых, вы должны получить все продукты.
$args = array( 'post_type' =gt; 'product', 'posts_per_page' =gt; -1 ); $products = new WP_Query( $args ); if ( $products-gt;have_posts() ) { while ( $products-gt;have_posts() ) { $products-gt;the_post(); // your logic will go here. } wp_reset_postdata(); }
Теперь посчитайте дни.
$product = wc_get_product( get_the_ID() ); $datetime = $product-gt;get_date_created(); $timezone = $datetime-gt;getTimezone(); $now_time = new WC_DateTime(); $now_time-gt;setTimezone($timezone); $timestamp_diff = $now_time-gt;getTimestamp() - $datetime-gt;getTimestamp(); $data = timestamp_to_array( $timestamp_diff ); $days = $data['d'];
Затем вы можете использовать wp_set_object_terms
и wp_remove_object_terms
для установки и удаления категории.
// If the difference is less than 60, apply "NEW IN cat" if ( $days lt; 60 ) { wp_set_object_terms( get_the_ID(), 40, 'product_cat', true ); }else{ wp_remove_object_terms( get_the_ID(), 40, 'product_cat' ); }
Заполните код. добавьте этот код ниже в свою активную тему functions.php файл.
function add_category_to_product_for_certain_days(){ $args = array( 'post_type' =gt; 'product', 'posts_per_page' =gt; -1 ); $products = new WP_Query( $args ); if ( $products-gt;have_posts() ) { while ( $products-gt;have_posts() ) { $products-gt;the_post(); $product = wc_get_product( get_the_ID() ); $datetime = $product-gt;get_date_created(); $timezone = $datetime-gt;getTimezone(); $now_time = new WC_DateTime(); $now_time-gt;setTimezone($timezone); $timestamp_diff = $now_time-gt;getTimestamp() - $datetime-gt;getTimestamp(); $data = timestamp_to_array( $timestamp_diff ); $days = $data['d']; // If the difference is less than 60, apply "NEW IN cat" if ( $days lt; 60 ) { wp_set_object_terms( get_the_ID(), 40, 'product_cat', true ); }else{ wp_remove_object_terms( get_the_ID(), 40, 'product_cat' ); } } wp_reset_postdata(); } } add_action( 'init', 'add_category_to_product_for_certain_days', 10, 1 ); function timestamp_to_array( $timestamp ) { $d = floor($timestamp/86400); $_d = ($d lt; 10 ? '0' : '').$d; $h = floor(($timestamp-$d*86400)/3600); $_h = ($h lt; 10 ? '0' : '').$h; $m = floor(($timestamp-($d*86400 $h*3600))/60); $_m = ($m lt; 10 ? '0' : '').$m; $s = $timestamp-($d*86400 $h*3600 $m*60); $_s = ($s lt; 10 ? '0' : '').$s; return array('d' =gt; $_d, 'h' =gt; $_h, 'm' =gt; $_m, 's' =gt; $_s); }
Проверено и работает.
Комментарии:
1. Спасибо за ваш ответ, он мне очень помог!
2. У меня просто есть еще один вопрос по этому коду. Теперь он автоматически устанавливает категорию, есть ли способ предотвратить любое превышение уже существующих катеограмм? Я проголосовал за это, но мне нужно по крайней мере 15 репутации.
3. есть ли способ предотвратить любые переопределения уже существующих категорий? =gt; не могли бы вы подробнее объяснить это?
4. Например, если я импортирую товары в woocommerce, я даю им уже фиксированные категории. Но когда я использую этот код, он переопределит уже установленные категории.
5. ладно, понял. обновит ответ.