Оскільки Esl 1.3.2, ви можете маніпулювати постами, продуктами або параметрами запиту циклу перед виконанням запиту наступним чином:
add_filter( 'esl/posts/query_vars', function( $query_vars, $settings, $element_id ) {// Використовуйте кастомне поле ACF, щоб обмежити запит до набору постівif ( $element_id == 'fhmnfx' && function_exists('get_field') ) { $query_vars['post__in'] = get_field('my_posts_acf_field'); } return $query_vars; }, 10, 3 );
Функція зворотного виклику фільтра отримує три аргументи:
$query_vars
асоціативний масив, що використовується для заповнення класу WP_Query$settings
асоціативний масив, що містить налаштування елемента, встановлені в системі$element_id
це рядок, що містить унікальний ідентифікатор елемента (з Esl 1.3.6)
Якщо ви маєте намір модифікувати $query_vars для запиту продуктів WooCommerce в Esl, розгляньте можливість збільшення аргументу пріоритету на більше значення, таке як 20 або 30. Невиконання цього може призвести до того, що ваш фільтр потенційно буде перекритий іншим кодом, який підключається до цього фільтра.
Приклад: Цикл зображень з поля Advanced Image Field від Metabox.io для поточного поста
add_filter( 'esl/posts/query_vars', function( $query_vars, $settings, $element_id ) {// Цілитесь тільки в елемент yeamhoif ( $element_id !== 'yeamho') return $query_vars;// Отримайте значення поля Advanced images Metabox. 'mg_projet_galerie_images' – це ідентифікатор поля$gallery_images = (array) rwmb_meta( 'mg_projet_galerie_images', ['size' => 'full'] );// Отримайте тільки ID зображень$gallery_images_ids = array_keys($gallery_images);// Якщо немає зображень галереї, встановіть порожній масив$gallery_images_ids = count( $gallery_images_ids ) > 0 ? $gallery_images_ids : [''];// Встановіть ID зображень як параметри post__in$query_vars['post__in'] = $gallery_images_ids;return $query_vars;}, 10, 3 );
Приклад: Використання ID галерейних зображень ACF поточної таксономії для циклу запитів медіа (Nestable Slider)
Якщо ви хочете побудувати динамічний слайдер в шаблоні архіву терміна, ви можете налаштувати цикл запитів на слайд, як на нижньому зображенні, і скористатися наведеним нижче фрагментом коду, щоб отримати ID зображень з поля галереї для кожного терміна, а потім призначити їх параметру post__in
.
add_filter( 'esl/posts/query_vars', function( $query_vars, $settings, $element_id ) {// Тільки для елемента id udcvuw if ( $element_id == 'udcvuw' && function_exists('get_field') ) {// Встановити на 0, щоб за замовчуванням не було результатів$query_vars['post__in'] = [0];$current_term = get_queried_object();// Перевірити, чи є поточна сторінка архівом терміна if( is_a( $current_term, 'WP_Term' ) ) {// Отримати зображення, пов'язані з поточним терміном, region_-_banniere це назва поля $images = get_field('region_-_banniere', 'region_'. $current_term->term_id );// Перевірити, чи існують зображення і чи їх більше 0 if( is_array( $images ) && count( $images ) > 0 ) {// Отримати ID зображень (якщо цей формат даних поля повертає масив)$images_ids = wp_list_pluck( $images, 'ID' );// Встановити запит, щоб включити лише публікації з цими ID зображень$query_vars['post__in'] = $images_ids;}}}return $query_vars;}, 10, 3 );
Приклад: Застосування аргументу orderby з 2 різними полями
Уявіть, що у вас є тип публікацій Performance з полем дати початку та полем часу початку. Оскільки ви не будете створювати публікації Performance в фактичному порядку, ви хочете впорядкувати публікації Performance за датою початку (в порядку зростання) і часом початку (в порядку спаду).
add_filter( 'esl/posts/query_vars', function( $query_vars, $settings, $element_id ) {// Тільки для елемента id 3b03dd if( $element_id !== '3b03dd') return $query_vars;// Встановити meta_query$query_vars['meta_query'] = ['relation' => 'AND','performance_start_date' => array('key' => 'performance_start_date','compare' => 'EXISTS',),'performance_start_time' => array('key' => 'performance_start_time','compare' => 'EXISTS',),];// Встановити orderby$query_vars['orderby'] = ['performance_start_date' => 'ASC','performance_start_time' => 'DESC'];return $query_vars;}, 10, 3 );
Приклад: Отримати пов’язані продукти WooCommerce
Створіть цикл запитів з такими налаштуваннями
add_filter( 'esl/posts/query_vars', function( $query_vars, $settings, $element_id) {if( $element_id !== 'azuxwi' ) return $query_vars;$product_id = get_the_ID();$product = wc_get_product( $product_id );if( ! is_a( $product, 'WC_Product' ) ) return $query_vars;// Виключити продукти upsell $upsell_ids = $product->get_upsell_ids();if( count( $upsell_ids ) > 0 ) {if( isset( $query_vars['post__not_in'] ) ) {$query_vars['post__not_in'] = array_merge( $query_vars['post__not_in'], $upsell_ids );} else {$query_vars['post__not_in'] = $upsell_ids;}}return $query_vars;}, 10, 3);
Приклад: Отримати продукти upsell WooCommerce
Створіть цикл запитів з наступними налаштуваннями:
add_filter( 'esl/posts/query_vars', function( $query_vars, $settings, $element_id ) {// Змініть Idif( $element_id !== 'shctqn') return $query_vars;$product_id = get_the_ID();$product = wc_get_product( $product_id );if( ! is_a( $product, 'WC_Product' ) ) return $query_vars;$upsell_ids = $product->get_upsell_ids();$query_vars['post__in'] = ( count( $upsell_ids ) > 0 )? $upsell_ids : [0] ;// у випадку, якщо у вас є варіація продукту, яка встановлена як upsell$query_vars['post_type'] = ['product', 'product_variation'];return $query_vars;}, 10, 3 );
Різні способи націлення запиту, окрім $element_id
Іноді ви можете захотіти націлити групу запитів, замість конкретного елемента, використовуючи $element_id
Використовувати умовну функцію тегу WordPress
// Націлюйте будь-який запит на архівній сторінціadd_filter( 'esl/posts/query_vars', function( $query_vars, $settings, $element_id ) {if( ! is_archive() ) return $query_vars;// Виконуйте вашу логіку тутreturn $query_vars;}, 10, 3 );
Перевірте, чи існує CSS клас на запитуваному елементі
// Націлюйте будь-який запит, якщо 'my-custom-class' встановлений на запитуваному елементі в STYLE > CSS > CSS Classesadd_filter( 'esl/posts/query_vars', function( $query_vars, $settings, $element_id ) {$css_class = isset( $settings['_cssClasses'] ) ? $settings['_cssClasses'] : '';if( $css_class === '' || strpos( $css_class, 'my-custom-class' ) === false ) {return $query_vars;}// Виконуйте вашу логіку тутreturn $query_vars;}, 10, 3 );// Націлюйте будь-який запит, якщо 'my-custom-class' є глобальним класом, встановленим на запитуваному елементіadd_filter( 'esl/posts/query_vars', function( $query_vars, $settings, $element_id ) {$global_css_classes = isset( $settings['_cssGlobalClasses'] ) ? EslElement::get_element_global_classes( $settings['_cssGlobalClasses'] ) : [];if( empty( $global_css_classes ) || ! in_array( 'my-custom-class', $global_css_classes ) ) {return $query_vars;}// Виконуйте вашу логіку тутreturn $query_vars;}, 10, 3 );