Стоит задача сделать сортировку, что товары определенного бренда были выше других. Все на WooCommerce
Создал кастомную сортировку
// При сохранении продукта дублируем атрибут в мета данные
add_action( 'save_post', 'woocommerce_attribute_to_meta' );
function woocommerce_attribute_to_meta( $post_id ) {
if (!empty($_REQUEST['attribute_names'])){
foreach( $_REQUEST['attribute_names'] as $index => $value ) {
update_post_meta( $post_id, $value, $_REQUEST['attribute_values'][$index] );
}
}
}
function woocommerce_get_catalog_ordering_attribute_args( $args ) {
global $wp_query;
// Меняем $_SESSION на $_GET
if (isset($_GET['orderby'])) {
switch ($_GET['orderby']) :
case 'pa_slojnost_asc' :
$args['order'] = 'ASC';
$args['meta_key'] = 'pa_brend';
$args['orderby'] = 'meta_value';
break;
endswitch;
}
return $args;
}
add_filter('woocommerce_get_catalog_ordering_args', 'woocommerce_get_catalog_ordering_attribute_args');
function woocommerce_catalog_orderby_attribute( $sortby ) {
$sortby['pa_slojnost_asc'] = 'Исходная сортировка';
return $sortby;
}
add_filter('woocommerce_catalog_orderby', 'woocommerce_catalog_orderby_attribute');
add_filter( 'woocommerce_default_catalog_orderby_options', 'woocommerce_catalog_orderby_attribute' );
Оно работает. Остается только добавить атрибут в метаполя для существующих товаров(около 500). Если сохранять или обновлять товары вручную то все работает. Но пройти 500 товаров просто не реально - поэтому прошу помощи.
Пытался использовать код:
add_action('woocommerce_loaded','new_attribute_to_meta');
function new_attribute_to_meta(){
global $wpdb;
$num=500; //Кол-во обрабатываемых записей
foreach(wc_get_products(array('numberposts' => $num)) as $pr){
foreach($pr->get_attributes() as $key=>$attr){
$val=wc_get_product_terms( $pr->get_id(), $attr->get_name(), array( 'fields' => 'all' ) );
if($key=='pa_brend'){
update_post_meta($pr->get_id(),'_'.$key,$val[0]->name);
}
}
}
}
Но ничего не работает. Помогите, пожалуйста!!!