Сортировка по идентификатору термина таксономии с помощью get_posts не работает

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

Я перебираю серию пользовательских типов записей и группирую их по термину таксономии. Это работает отлично, однако мне не удалось упорядочить эти группировки по term_id.

Я использовал var_dump, чтобы проверить term_id, и они соответствуют ожидаемым. На самом деле, никакие параметры orderby не работают вообще – они всегда упорядочены по заголовку термина таксономии. В данном случае моя таксономия issue_area включает термины, такие как ‘Человеческие услуги’, ‘Образование’ и так далее.

Что я пропустил здесь?

Вот цикл, который я использую:

<?php

$terms = get_terms('issue_area'); // это моя пользовательская таксономия
foreach( $terms as $term ):
$termed =  preg_replace('/\d/', '', $term->name ); // разделяю числа
?>                          

<h3 class="expert-term"><?php echo $termed; // Вывод имени термина ?></h3>

<?php var_dump($term->term_id); ?> <?php // это возвращает int, как и ожидалось ?>

    <ul class="experts">

    <?php $posts = get_posts(array(
     'post_type' => 'uwmc_experts', // мой cpt
     'taxonomy' => $term->taxonomy,
     'term' => $term->slug,
     'orderby' => $term->term_id, // пробовал: taxonomy_term_id
     'order' => 'ASC', // пробовал DESC - без изменений
     'numberposts' => -1,
    ));

    foreach($posts as $post): 
     setup_postdata($post); 
    ?> 

    <?php if( have_rows('experts') ): ?> <?php // ACF повторитель ?>

    <?php while( have_rows('experts') ): the_row(); 

        $image = get_sub_field('expert_photo');
        $content = get_sub_field('expert_bio');
        $areas = get_sub_field('areas'); ?>

        <li class="expert">

        <?php // остальная часть цикла повторителя здесь ?>

Вместо того чтобы пытаться сделать это с помощью параметра orderby, я пошел другим путем.

Логично, что параметр orderby выше применяется только к записям в каждой группировке, а не к самой группировке термина таксономии, поэтому он не будет работать для этого.

Что я в итоге сделал, так это добавил 01, 02, 03 и так далее к самому имени термина таксономии, а затем убрал это с помощью PHP. Таким образом, у меня были термины, такие как:

01 Человеческие услуги
02 Образование 
03 Финансовая стабильность

Я пронумеровал их в порядке, в котором хотел, так как они не будут меняться динамически. Затем я использовал следующее, чтобы убрать номера из термина и отобразить обновленные термины:

<?php
// Вывод всех названий таксономий с их соответствующими элементами
$terms = get_terms('issue_area');
foreach( $terms as $term ):
$termed =  preg_replace('/\d/', '', $term->name );
?>                          

<h3 class="expert-term"><?php echo $termed; // Вывод имени термина ?></h3>

Очевидно, это намного проще, чем сложный SQL-запрос, и дает мне нужные результаты.

Вот пример в реальном времени: http://pressroom.uw-mc.org/meet-our-experts/

Мой первоначальный вопрос также был обновлен с моим ответом.

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

Когда вы работаете с кастомными типами записей и таксономиями в WordPress, может возникнуть ряд сложностей, особенно когда речь идет о сортировке. В вашем случае вы столкнулись с проблемой сортировки записей по term_id таксономии, что не работает как ожидалось. Давайте подробно рассмотрим возможные причины этой проблемы и предложим решения.

Проблема с orderby

Когда вы используете get_posts для получения записей по определенной таксономии, параметры сортировки, такие как orderby, относятся только к записям, а не к группировке по таксономиям. Это означает, что вы не сможете использовать term_id в качестве параметра сортировки для группировки записей, когда в запросе указана таксономия.

Ваша логика выглядит правильной — вы хотите сортировать записи на основе идентификаторов терминов (в данном случае term_id). Однако, get_posts не позволяет напрямую сортировать результаты по этому критерию. Вместо этого сортировка осуществляется путем упорядочивания записей по их заголовкам или другим метаданным, которые вы можете указать.

Альтернативное решение

Вы нашли эффективное решение — модификация названий таксономий, добавление префиксов в виде номеров и их последующее удаление через PHP. Это звучит как практичный подход, особенно если ваши термины фиксированы и не меняются динамически. Преимущества этого решения включают:

  1. Упрощение логики: Вы избегаете сложных SQL-запросов и других манипуляций с базой данных.
  2. Чистота кода: Ваш код становится более прозрачным, так как он основывается на простых строковых операциях.
  3. Гибкость: Легко управлять порядком отображения терминов, изменив лишь их названия.

Рекомендации

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

  1. Использование пользовательских полей: При настройке таксономий вы можете добавить мета-поля, которые будут хранить номер или порядок терминов. Это обеспечит большую гибкость и удобство сортировки.

  2. Расширить WP_Query: Вместо get_posts, рассмотрите использование WP_Query, который предлагает больше возможностей для кастомизации запросов к базе данных, включая возможность сортировки по метаданным.

  3. Функции сортировки: Если ваш список терминов не велик, вы можете использовать PHP-функции для сортировки массива терминов, полученных от get_terms, до начала цикла.

Вот пример использования пользовательских полей для сортировки:

$terms = get_terms(array(
    'taxonomy' => 'issue_area',
    'orderby' => 'meta_value_num', // Используйте meta_value для сортировки
    'order' => 'ASC',
));

foreach ($terms as $term) {
    // Логика вывода терминов и связанных сокращений
}

Заключение

Ваше текущее решение, основанное на нумерации названий, может служить временным и эффективным подходом в специфических случаях. Тем не менее, для более гибкой и масштабируемой системы, стоит рассмотреть интеграцию пользовательских полей или более сложные конструкции запроса, такие как использование WP_Query. Это обеспечит вам большую функциональность и удобство в будущем.

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

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