Фільтр за спеціальним полем у користувацькому типі публікації на сторінці адміністратора


11

Я використовував розширені спеціальні поля для створення спеціальних полів для назви змагань, відповідей тощо. Я створив тип користувальницького типу для змагань, як показано на зображенні, і я використовував функції Wordpress.php для створення стовпців зі своїх спеціальних значень полів.

Я намагаюся отримати поле "Filter by" -dropdown із змаганнями різних імен / міток, як показано нижче, але я можу знайти рішення лише за допомогою таксономій, які я скоріше не використовую, якщо можливо, тому що я використовував лише спеціальні поля для все інше.

Чи можливо зробити спеціальне спадне меню "Фільтрувати за", використовуючи лише спеціальні поля?

Wordpress фільтр за


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

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

Відповіді:


12

А для відображення результату для Filter тоді спробуйте цей код

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'] = '=';
  }
}

Змініть мета-ключ та мета-значення за потребою. Я взяв "ім'я змагань як мета_кейк" та "ім'я конкуренції" як виберіть спадне ім'я.


Приємно, мені було лінь, тому я запропонував йому задати додаткове запитання;)
Девід Гард

Здається, що два відповіді є повною відповіддю, і їх слід поєднувати.
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: помилка підготовки:

$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.