@easycode
не боюсь задавать глупые вопросы ))

Сортировка терминов таксономии по значению мета-поля в WordPress?

Есть задача в WordPress для кастомной таксономии выводить термины с сортировкой по значению мета поля в формате DATETIME (Y-m-d H:i:s)

61af0edd6c9ee001491698.png

мета поле задано с помощью ACF-плагина и в БД всё ок:

61af0f95c6aff861672878.png

полный код:

add_filter( 'get_terms_args', function ( $args, $taxonomies ) {

  global $pagenow;

  if ( is_admin() && $pagenow == 'edit-tags.php' && $taxonomies[0] == 'program_session' ) {
    $args['meta_query'] = [
      'relation' => 'AND',
      'conference' => [
        'key'       => 'conference_id',
        'value'     => get_active_conf_id(),
        'compare'   => 'LIKE'
      ],
      'session_start' => array(
    	'key'     => 'program_session_start',
        'type' => 'DATETIME',
        'compare' => 'EXISTS',
    	),
    ];
    $args['orderby'] = 'session_start';
    $args['order'] = 'ASC';
  }

  return $args;

}, 10, 2 );


Условие фильтрации по conference_id работает прекрасно, а вот сортировка нет.

Пробовал вот так:

$term_query = new WP_Term_Query( [
  'taxonomy' => ['program_session'],
  'hide_empty'    => false,
  'meta_query' => [
    'relation' => 'AND',
    'conference' => [
      'key'       => 'conference_id',
      'value'     => get_active_conf_id(),
      'compare'   => 'LIKE'
    ],
    'session_start' => array(
      'key'     => 'program_session_start',
      'type' => 'DATETIME',
    ),
  ],
  'orderby' => 'session_start',
  'order' => 'ASC',
] );
echo '<pre>';
print_r($term_query->terms);


всё сортируется правильно:

Array
(
    [0] => WP_Term Object
        (
            [term_id] => 67
            [name] => Вкусный завтрак
            [slug] => vkus
            [term_group] => 0
            [term_taxonomy_id] => 67
            [taxonomy] => program_session
            [description] => 
            [parent] => 0
            [count] => 0
            [filter] => raw
        )

    [1] => WP_Term Object
        (
            [term_id] => 65
            [name] => Хороший обед
            [slug] => horoshij-obed
            [term_group] => 0
            [term_taxonomy_id] => 65
            [taxonomy] => program_session
            [description] => 
            [parent] => 0
            [count] => 0
            [filter] => raw
        )

    [2] => WP_Term Object
        (
            [term_id] => 66
            [name] => И просто ужин
            [slug] => uzhin
            [term_group] => 0
            [term_taxonomy_id] => 66
            [taxonomy] => program_session
            [description] => 
            [parent] => 0
            [count] => 0
            [filter] => raw
        )

)


что-то не так с фильтром для get_terms_args ?
  • Вопрос задан
  • 288 просмотров
Решения вопроса 1
@easycode Автор вопроса
не боюсь задавать глупые вопросы ))
Не кошерное решение:

add_filter( 'get_terms_args', function ( $args, $taxonomies ) {

  global $pagenow;

  if ( is_admin() && $pagenow == 'edit-tags.php' && $taxonomies[0] == 'program_session' ) {
    $args['menu_order'] = false;
    $args['ignore_term_order'] = false;
    $args['meta_query'] = [
      'conference' => [
        'key'       => 'conference_id',
        'value'     => _get_active_conf_id(),
        'compare'   => 'LIKE'
      ],
    ];
  }

  return $args;

}, 10, 2 );

add_filter( 'terms_clauses', function ( $pieces, $taxonomies, $args ) {
    global $pagenow, $wpdb;
    if ( is_admin() && $pagenow == 'edit-tags.php' && $taxonomies[0] == 'program_session' ) {
        $pieces['join']  .= ' INNER JOIN ' . $wpdb->termmeta . ' AS tm ON t.term_id = tm.term_id ';
        $pieces['where'] .= ' AND tm.meta_key = "program_session_start"';
        $pieces['orderby']  = ' ORDER BY tm.meta_value ';
    }
    return $pieces;
}, 10, 3 );
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы