Сортировка по полю ACF в tax_query

Вопрос или проблема

Я не могу найти решение, которое должно быть простым. (Я новичок в WP) У меня есть поле ACF с именем “partners_order”. Я хотел бы отсортировать его в порядке возрастания (ASC)

вот что я пробовал

<?php $terms = get_terms('type_partenaires');

usort($terms, function($a, $b) {
    return get_field('ordre_affichage', $a) - get_field('ordre_affichage', $b);
});

foreach ( $terms as $term ): ?>

    <?php echo $term->name; ?>


<?php $loop = new WP_Query( array(
    'post_type' => 'partenaires',
    'orderby'  => 'title',
    'order'    => 'ASC',
    'posts_per_page' => -1,
    'paged' => $paged,
    'tax_query' => array(
        array(
            'taxonomy' => 'type_partenaires',
            'field'    => 'ID',
            'terms'    => $term->term_id,
            'orderby'  => 'partners_order',
            'order'    => 'ASC',
        ),
    ),

) ); ?>

если кто-то мог бы дать мне направление для дальнейших действий… спасибо

Вы разместили orderby в неправильном массиве. Пожалуйста, проверьте измененный код.

$loop = new WP_Query( array(
    'post_type' => 'partenaires',
    'orderby'  => 'title',
    'order'    => 'ASC',
    'posts_per_page' => -1,
    'paged' => $paged,
   'meta_key'=> 'partners_order', 
   'orderby' => 'meta_value_num', 
   'order' => 'ASC', 
    'tax_query' => array(
        array(
            'taxonomy' => 'type_partenaires',
            'field'    => 'ID',
            'terms'    => $term->term_id

        ),
    ),

) ); 

Спасибо за ваш ответ, но когда я тестирую, ничего не отображается, кроме type_partenaires.

Я думаю, что ошибся в объяснении моей проблемы. Извините.

Я хотел бы иметь возможность сортировать по полю “partners_order”. Это поле находится в моем цикле после моих $loops

<?php $terms = get_terms('type_partenaires');

                        usort($terms, function($a, $b) {
                            return get_field('ordre_affichage', $a) - get_field('ordre_affichage', $b);
                        });


                        foreach ( $terms as $term ): ?>

                            <div class="cell small-12 medium-12 large-12">
                                <h2 class="title-type-partenaire"><?php echo $term->name; ?></h2> 
                            </div>  

                            <?php 

                                $loop = new WP_Query( array(
                                'post_type' => 'partenaires',
                                'orderby'  => 'title',
                                'order'    => 'ASC',
                                'posts_per_page' => -1,
                                'paged' => $paged,
                                'tax_query' => array(
                                    array(
                                        'taxonomy' => 'type_partenaires',
                                        'field'    => 'ID',
                                        'terms'    => $term->term_id,

                                    ),
                                ),


                                ) ); ?>

                        <div class="cell large-12">
                            <ul class="flex-partenaire">
                            <?php if (have_posts()) : while ( $loop->have_posts() ) : $loop->the_post(); ?>

                                <?php get_template_part( 'template-parts/loop', 'page-partenaires' ); ?>

                            <?php endwhile; ?>
                            </ul>   
                        </div>

‘tax_query’ – это условие для фильтрации записей; если вы хотите получить упорядоченные термины для поста в цикле, возможно, использование ‘wp_get_post_terms’ будет правильным; например:

$loop = new WP_Query( array(
    'post_type' => 'partenaires',
    'orderby'  => 'title',
    'order'    => 'ASC',
    'posts_per_page' => -1,
    'paged' => $paged));

if ( $loop->have_posts() ):
  while ($loop->have_posts()) :
    $loop->the_post();
      $terms = wp_get_object_terms( get_the_ID(), 'type_partenaires', array(
        'orderby' => 'meta_value',
        'meta_key' => 'partners_order'
      ));
      array_map(function($term) {
        var_dump($term->name);
      }, $terms);    
  endwhile;
endif;

поле ‘partners_order’ – это мета-данные терминов.

если это не так, используйте ‘meta_key’ в основном цикле.

Ответ или решение

Чтобы отсортировать записи WordPress по пользовательскому полю ACF (Advanced Custom Fields), необходимо выполнить несколько шагов. В вашем случае вы хотите сортировать записи по полю "partners_order". Давайте рассмотрим, как это можно сделать.

Основная структура WP_Query

Первый шаг — это корректное создание запроса с использованием WP_Query, который позволяет получить записи определенного типа, применяя условия сортировки на основе метаполей.

Правильный пример кода

Исходя из вашего кода, нужно внести некоторые коррективы для достижения желаемого результата. Вот как может выглядеть финальный код:

<?php 
$terms = get_terms('type_partenaires');

// Сортируем термины по полю partners_order
usort($terms, function($a, $b) {
    $a_order = get_field('partners_order', $a);
    $b_order = get_field('partners_order', $b);
    return $a_order <=> $b_order; // Используем оператор корабль
});

// Проходим по отсортированным терминам
foreach ($terms as $term): 
?>

    <div class="cell small-12 medium-12 large-12">
        <h2 class="title-type-partenaire"><?php echo esc_html($term->name); ?></h2> 
    </div>  

    <?php 
    // Запрос на получение записей
    $loop = new WP_Query(array(
        'post_type' => 'partenaires',
        'posts_per_page' => -1,
        'paged' => $paged,
        'tax_query' => array(
            array(
                'taxonomy' => 'type_partenaires',
                'field' => 'ID',
                'terms' => $term->term_id,
            ),
        ),
        'meta_key' => 'partners_order', // Указываем метаполе для сортировки
        'orderby' => 'meta_value_num', // Сортируем по числовому значению
        'order' => 'ASC', // Порядок сортировки
    )); ?>

    <div class="cell large-12">
        <ul class="flex-partenaire">
        <?php if ($loop->have_posts()) : while ($loop->have_posts()) : $loop->the_post(); ?>
            <li>
                <?php get_template_part('template-parts/loop', 'page-partenaires'); ?>
            </li>
        <?php endwhile; endif; ?>
        </ul>   
    </div>

<?php
endforeach; 
wp_reset_postdata(); // Сбрасываем данные поста после цикла
?>

Объяснение кода

  1. Получение терминов: Мы используем get_terms для извлечения терминов из таксономии type_partenaires.

  2. Сортировка терминов: Используем usort для сортировки терминов, извлекая значение partners_order для каждого термина.

  3. Запрос записей: Затем создается новый объект WP_Query, который ищет записи типа partenaires, принадлежащие к определенному термину (используем tax_query).

  4. Сортировка записей: В параметрах запроса указываем meta_key с полем partners_order и применяем orderby => 'meta_value_num' для сортировки по числовым значениям.

  5. Вывод записей: Внутри цикла while проверяем наличие записей и выводим их, используя шаблон для каждой записи.

Заключение

Работа с пользовательскими полями и таксономиями в WordPress требует внимательного подхода к структурированию запросов. Приведённый выше код позволит вам правильно отсортировать записи по ACF полю partners_order. Убедитесь, что значения в поле корректно заданы для всех терминов и записей, чтобы избежать пустых результатов. Если будут возникать сложности, проверьте наличие данных в ACF и правильность их назначения.

Оцените материал
Добавить комментарий

Капча загружается...