Сортируемый пользовательский столбец, использующий поле выбора ACF Pro в Wordpress admin для списка сообщений

Код, который работает для создания нового столбца в админке Wordpress для списка сообщений:

//adds new column to posts list in Wordpress admin
add_filter( 'manage_posts_columns', 'set_custom_edit_mycpt_columns' );

function set_custom_edit_mycpt_columns( $columns ) {
  $columns['acf_field'] = __( 'Editorial status', 'my-text-domain' );

  return $columns;
}

// pulls label from ACF Pro select field into new column for each post
add_action( 'manage_posts_custom_column' , 'custom_mycpt_column', 10, 2 );
function custom_mycpt_column( $column, $post_id ) {
  switch ( $column ) {

    // display the value of an ACF (Advanced Custom Fields) field
    case 'acf_field' :
      $ed_status = get_field_object( 'ed_status_acf', $post_id ); 
      $ed_status_pretty = $ed_status['label'];
      echo $ed_status_pretty;
      break;

  }
}

Проблема: я успешно вытаскиваю ярлыки из поля выбора, созданного в Advanced Custom Fields Pro для каждого сообщения, и вижу, что эти ярлыки заполняются в столбце "Редакционный статус". (См. Рабочую часть кода выше.) Я не могу понять, как сделать этот столбец сортируемым, несмотря на то, что пробовал разные учебники.

Нерабочая часть кода появляется ниже. Этот код не нарушает работу сайта - колонка просто остается несортируемой.

// make new column sortable by ACF field
add_filter( 'manage_edit-posts_sortable_columns', 'set_custom_mycpt_sortable_columns' );

function set_custom_mycpt_sortable_columns( $columns ) {
  $columns['custom_taxonomy'] = 'custom_taxonomy';
  $columns['acf_field'] = 'acf_field';

  return $columns;
}

// give parameters to Wordpress for sorting the new column
add_action( 'pre_get_posts', 'mycpt_custom_orderby' );

function mycpt_custom_orderby( $query ) {
  if ( is_admin() ) {
    return;

  $orderby = $query->get( 'orderby');

  if ( 'acf_field' == $orderby ) {
    $query->set( 'meta_key', 'acf_field' );
    $query->set( 'orderby', 'meta_value' );
  }
  }
}

Цель: выяснить, что я делаю неправильно, и сделать столбец "Редакционный статус", который появляется на странице списка сообщений в Wordpress, можно отсортировать. Я хотел бы иметь возможность сортировать по алфавиту по статусу редактора (например, черновик, ожидает рассмотрения, находится на рассмотрении и т. Д.)

Весь код выше в настоящее время в пользовательском плагине, который я создал. Я видел решения, которые работают, когда поля выбора ACF Pro не используются, поэтому я чувствую, что это связано с pre_get_posts и используя мету из выбора с get_field_object, но я не уверен.

Любые отзывы приветствуются, так как я не могу понять, где я иду не так! Я знаю, что есть плагины для создания настраиваемых сортируемых столбцов для Wordpress. Я хотел бы знать, что я делаю здесь не так, чтобы учиться. Спасибо!

2 ответа

Похоже, мы столкнулись с одними и теми же руководствами, пытаясь выполнить такую ​​​​задачу.

Это то, что в итоге сработало для меня.

В моем случае я хотел добавить поле ACF в качестве столбца на панели администратора, а затем сделать этот столбец сортируемым.

«Каталог» — это тип записи. "email" - это имя ACF

добавить столбец

      add_filter('manage_directory_posts_columns', 'filter_directory_custom_columns');

function filter_directory_custom_columns($columns) {
    $columns['email'] = 'Email';
    return $columns;
}

заполнить строки почтовыми данными

      add_action('manage_directory_posts_custom_column',  'action_directory_custom_columns');

function action_directory_custom_columns($column) {
    global $post;
    if($column == 'email') {
        $directoryfields = get_fields($post->ID);
        echo $directoryfields['email'];
    }
}

сделать столбец сортируемым

      add_filter( 'manage_edit-directory_sortable_columns', 'sortable_directory_custom_columns' );

function sortable_directory_custom_columns( $columns ) {
    $columns['email'] = 'email';
    return $columns;
}

Это была та часть, которой мне не хватало.

      add_action( 'pre_get_posts', 'directory_orderby' );
function directory_orderby( $query ) {
    if( ! is_admin() )
        return;
    $orderby = $query->get( 'orderby');
    if( 'email' == $orderby ) {
        $query->set('meta_key','email');
        $query->set('orderby','meta_value');
    }
}

спасибо сообществу UtahWP(jazzsequence, ninnypants) за помощь в преодолении этого

Не могу помочь с вашим кодом, но если вы дошли до того, что устали от него работать, вы можете обратиться к Admin Columns Pro.

Давайте легко создадим столбцы для записей или списков страниц (или любой CPT/ таксономии), и вы можете установить эти столбцы для встроенного редактирования, сортировки, фильтрации и т. Д.

Поставил бы это как комментарий, но не хватило очков. Сожалею.

Другие вопросы по тегам