Пользовательский фильтр запросов для записей Elementor по полю связи (ACF)

#wordpress #woocommerce #advanced-custom-fields #custom-post-type #elementor

#wordpress #woocommerce #расширенные пользовательские поля #пользовательский тип записи #elementor

Вопрос:

У меня есть настраиваемый тип записи под названием «Исполнители». Каждый отдельный исполнитель представляет собой страницу (профиль исполнителя, если хотите), имеет список продуктов, которые связаны с этим исполнителем через тип поля связи через расширенные пользовательские поля (ACF). Мне нужно, чтобы товары отображались в своих категориях на странице исполнителя. Итак, в Elementor мне нужно указать «Идентификатор фильтра запроса», чтобы просто разделить продукты на категории.

Что я пробовал до сих пор

Я пытаюсь отобразить в списке только товары из определенной категории с помощью пользовательского запроса, поскольку мне нужно сгенерировать идентификатор запроса.

Я пробовал множество разных способов сделать это, но теперь я в растерянности. Последний код, который у меня есть, находится здесь… чего мне не хватает?

 /** Product category 'SOFTWARE' **/
add_filter( 'software_product', 'product_category_software' );

function product_category_software( $variable ) {

    $query_args = array(
       'post_type' => 'product',
       'tax_query' => array(
            array(
                'taxonomy' => 'category',
                'field'    => 'slug',
                'terms'    => 'software', 
            ),
        ),
     );
return $variable;
}
  

Ответ №1:

Ответ

Вам нужно использовать это

https://developers.elementor.com/custom-query-filter/#Using_the_Custom_Filter

arbitrary_name_query_id — идентификатор ЗАПРОСА, который вы заполняете в поле Elementor,

код, который будет размещен внутри functions.php :

 add_action( 'elementor/query/arbitrary_name_query_id', function( $query ) {
    $meta_query = $query->get( 'meta_query' ); 
    $meta_query[] = [ 
        'key' => 'acf_key', // put ACF relationship field name 
        'value' => get_the_ID(), 
        'compare' => '=', 
    ]; 
    $query->set( 'meta_query', $meta_query ); 
} ); 
  

Что касается данного кода

Прежде всего, как говорится в документации WordPress по фильтрам:

Они (т. Е. фильтры) предоставляют функциям возможность изменять данные других функций.

Это означает, что функция фильтра, в данном случае это product_category_software , получает данные, которые впоследствии изменяются, и возвращает их обратно:

 add_filter( 'software_product', 'product_category_software' );
function product_category_software( $variable ) { // receive $variable

    /**
     * Modify $variable here
     */

    return $variable; // return modified $variable
}
  

В вашем случае product_category_software не изменяет то, что получает, но вводит новый набор данных, $query_args который не имеет значения, поскольку он не будет возвращен.

Во-вторых, первым аргументом add_filter функции должно быть существующее имя фильтра, software_product таковым не является.

В-третьих, правильное название таксономии категорий продуктов product_cat .

Получение товаров из определенной категории

Подход # 1 Изменение основного запроса с помощью pre_get_posts

 function your_arbitrary_name( $query ) { // receive
    if ( ! is_admin() amp;amp; is_post_type_archive( 'product' ) amp;amp; $query->is_main_query() ) {
        $tax_query = array(
            array(
                'taxonomy' => 'product_cat',
                'field' => 'slug',
                'terms' => array('software'),
            )
        );

        $query->set( 'meta_query', $tax_query ); // modify
    }
    return $query; // and return
}
add_action( 'pre_get_posts', 'your_arbitrary_name', 20 );
  

Подход № 2 Использовать wc_get_products или WC_Product_Query

Например, используйте в вашем контроллере или даже в шаблоне:

 $args = array(
    'category' => array( 'software' ),
);
$products = wc_get_products( $args );
  

Прочитайте документы о wc_get_products и WC_Product_Query

Комментарии:

1. Большое спасибо, однако это не сработало … но я подозреваю, что это потому, что я не слишком подробно объяснил для начала. Итак, позвольте мне рассказать вам немного подробнее. У меня есть настраиваемый тип записи под названием «Исполнители». На этой странице (профиль исполнителя, если хотите) приведен список продуктов, которые связаны с этим исполнителем через тип поля связи через расширенные пользовательские поля. Мне нужно, чтобы товары отображались в своих категориях на странице исполнителя. Итак, в Elementor мне нужно указать «Фильтр запросов», чтобы просто разделить продукты на категории. Большое спасибо

2. Действительно, это немного отличается от того, что вы описывали выше. Если я правильно понимаю, вам нужно использовать это developers.elementor.com/custom-query-filter /… arbitrary_query_id — ИДЕНТИФИКАТОР ЗАПРОСА, который вы заполняете в поле и коде: add_action( ‘elementor/query/arbitrary_query_id’, функция( $query ) { $meta_query = $query->get( ‘meta_query’ ); $meta_query[] = [ ‘key’ => ‘acf_key’, // поместите имя поля связи ACF ‘value’ => get_the_ID(), ‘сравнить’ => ‘=’, ]; $ запрос-> set( ‘meta_query’, $meta_query ); } );

3. Это именно то, что нужно, и это сработало как шарм. Большое спасибо 🙂