Фильтр по настраиваемому полю в настраиваемом типе записи на странице администратора


11

Я использовал расширенные настраиваемые поля для создания настраиваемых полей для названия соревнования, ответов и т. Д. Я создал собственный тип публикации для соревнований, как показано на рисунке, и использовал Wordpress functions.php для создания столбцов из значений моих настраиваемых полей.

Я пытаюсь получить раскрывающийся список «Фильтровать по» с различными именами / ярлыками соревнований, как показано ниже, но я могу найти решения только с использованием таксономий, которые я, скорее всего, не использую, если возможно, потому что я использовал только настраиваемые поля для все остальное.

Можно ли сделать собственный выпадающий список «Фильтровать по», используя только пользовательские поля?

Wordpress фильтр


Вы можете использовать restrict_manage_postsловушку действия, чтобы добавить дополнительные выпадающие списки. Не забывайте, что вам также необходимо добавить некоторую логику для фильтра, поскольку WP не будет знать, что с ним делать из коробки (в отличие от выпадающих списков таксономии, которые он может обрабатывать автоматически).
Дэвид Гард

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

Ответы:


12

И для отображения результата для фильтра, попробуйте этот код

add_filter( 'parse_query', 'prefix_parse_filter' );
function  prefix_parse_filter($query) {
   global $pagenow;
   $current_page = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';

   if ( is_admin() && 
     'competition' == $current_page &&
     'edit.php' == $pagenow && 
      isset( $_GET['competition-name'] ) && 
      $_GET['competition-name'] != '') {

    $competion_name = $_GET['competition-name'];
    $query->query_vars['meta_key'] = 'competition_name';
    $query->query_vars['meta_value'] = $competition_name;
    $query->query_vars['meta_compare'] = '=';
  }
}

Измените мета-ключ и мета-значение, как требуется. Я выбрал «имя соревнования в качестве meta_key» и «имя соревнования» в качестве имени выпадающего списка.


Хорошо, мне было лень, поэтому он предложил задать дополнительный вопрос;)
Дэвид Гард

Похоже, что 2 ответа являются полным ответом и должны быть объединены.
RCNeil

10

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

В приведенном ниже примере мы сначала убедиться , что сообщение типа правильно, а затем захватить все значения DB , сохраненные против competition_nameключа в postmetaтаблице (вы должны изменить имя ключа по мере необходимости). Запрос является довольно простым и проверяет только то, опубликовано ли соревнование , принимает ли только уникальные значения (вы не хотите дублировать в раскрывающемся списке), а затем упорядочивает их в алфавитном порядке.

Затем мы проверяем результаты (нет смысла выводить выпадающий список ни за что), а затем строим параметры (включая значение по умолчанию, чтобы показать все). Наконец, выпадающий список выводится.

Как указано в моем комментарии, это еще не конец истории; вам понадобится некоторая логика, чтобы сказать Таблице списков, чтобы она показывала желаемые результаты только тогда, когда фильтр активен, но я оставлю вас посмотреть на это, а затем начать другой вопрос, если вам потребуется дополнительная помощь. Подсказка - проверьте файл /wp-admin/includes/class-wp-posts-list-table.php, и это родитель.../wp-class-list-table.php

/**
 * Add extra dropdowns to the List Tables
 *
 * @param required string $post_type    The Post Type that is being displayed
 */
add_action('restrict_manage_posts', 'add_extra_tablenav');
function add_extra_tablenav($post_type){

    global $wpdb;

    /** Ensure this is the correct Post Type*/
    if($post_type !== 'competition')
        return;

    /** Grab the results from the DB */
    $query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type
    );
    $results = $wpdb->get_col($query);

    /** Ensure there are options to show */
    if(empty($results))
        return;

    // get selected option if there is one selected
    if (isset( $_GET['competition-name'] ) && $_GET['competition-name'] != '') {
        $selectedName = $_GET['competition-name'];
    } else {
        $selectedName = -1;
    }

    /** Grab all of the options that should be shown */
    $options[] = sprintf('<option value="-1">%1$s</option>', __('All Competitions', 'your-text-domain'));
    foreach($results as $result) :
        if ($result == $selectedName) {
            $options[] = sprintf('<option value="%1$s" selected>%2$s</option>', esc_attr($result), $result);
        } else {
            $options[] = sprintf('<option value="%1$s">%2$s</option>', esc_attr($result), $result);
        }
    endforeach;

    /** Output the dropdown menu */
    echo '<select class="" id="competition-name" name="competition-name">';
    echo join("\n", $options);
    echo '</select>';

}

При использовании этого я получаю ошибкуNotice: wpdb::prepare was called incorrectly. The query does not contain the correct number of placeholders (6) for the number of arguments passed (5). Please see Debugging in WordPress for more information. (This message was added in version 4.8.3.) in /[...]/wp-includes/functions.php on line 4773
rassoh

Я также получаю ту же ошибку
Васим Шейх

0

Если это ни для кого не работает, моему решению нужно было добавить столбец, по которому я пытался отфильтровать, в список сортируемых столбцов для моего пользовательского типа записи.

// Make Custom Post Type Custom Columns Sortable
function cpt_custom_columns_sortable( $columns ) {

    // Add our columns to $columns array
    $columns['item_number'] = 'item_number';
    $columns['coat_school'] = 'coat_school'; 

    return $columns;
} add_filter( 'manage_edit-your-custom-post-type-slug_sortable_columns', 'cpt_custom_columns_sortable' );

0

Замените приведенный ниже запрос, чтобы исправить ошибку wpdb: prepare:

$query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type,
        'competition_name' //this is needed a second time to define "%3$s" in ORDER BY
  );
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.