Filtruj według niestandardowego pola w niestandardowym typie postów na stronie administratora


11

Użyłem zaawansowanych niestandardowych pól do utworzenia niestandardowych pól dla nazwy konkursu, odpowiedzi itp. Stworzyłem niestandardowy typ postu dla konkursów, jak pokazano na obrazku i użyłem Wordpress functions.php, aby utworzyć kolumny z moich wartości pól niestandardowych.

Próbuję uzyskać pole „Filtruj według” z konkursami o różnych nazwach / etykietach, jak pokazano poniżej, ale mogę znaleźć rozwiązania tylko przy użyciu taksonomii, których raczej nie używam, jeśli to możliwe, ponieważ użyłem tylko niestandardowych pól dla wszystko inne.

Czy jest możliwe utworzenie niestandardowego menu „Filtruj według” przy użyciu tylko niestandardowych pól?

Filtr Wordpress według


Możesz użyć restrict_manage_postshaka akcji, aby dodać dodatkowe pola rozwijane. Nie zapominaj, że będziesz musiał również dodać logikę do filtra, ponieważ WP nie będzie wiedział, co z nim zrobić po wyjęciu z pudełka (w przeciwieństwie do list rozwijanych systematyki, które może automatycznie obsługiwać).
David Gard,

Jako dodatkowe przemyślenie - jeśli chcesz, możesz utworzyć Nazwę, aby połączyć się w Tabeli Listy, co oznacza, że ​​możesz filtrować Konkurs, klikając nazwę, a nie rozwijaną listę.
David Gard

Odpowiedzi:


12

Aby wyświetlić wynik dla filtra, wypróbuj ten kod

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

Zmień klucz meta i wartość meta zgodnie z wymaganiami. Wziąłem „nazwa zawodów jako meta_key i„ nazwa zawodów ”jako rozwijaną nazwę.


Fajnie, czułem się leniwy, więc zasugerowałem, aby zadał dodatkowe pytanie;)
David Gard

Wydaje się, że 2 odpowiedzi są kompletną odpowiedzią i powinny zostać połączone.
RCNeil

10

Akcja „ ogranicz_manage_posts” uruchamia add_extra_tablenav()funkcję, w ten sposób dodajesz dodatkowe listy rozwijane do żądanej tabeli list.

W poniższym przykładzie najpierw upewniamy się, że typ postu jest poprawny, a następnie pobieramy wszystkie wartości DB zapisane względem competition_nameklucza w postmetatabeli (musisz zmienić nazwę klucza zgodnie z wymaganiami). Zapytanie jest dość proste i sprawdza tylko, czy Konkurs został opublikowany, przyjmuje tylko unikalne wartości (nie chcesz duplikowania w menu rozwijanym), a następnie porządkuje je alfabetycznie.

Następnie sprawdzamy wyniki (nie ma sensu wypisywanie listy rozwijanej na nic), a następnie konstruujemy opcje (w tym defualt do pokazania wszystkich). Wreszcie rozwijane jest wyjście.

Jak stwierdzono w moim komentarzu, to jednak nie koniec historii; będziesz potrzebować trochę logiki, aby powiedzieć Tabeli list, aby wyświetlała pożądane wyniki tylko wtedy, gdy filtr jest aktywny, ale zostawię cię, abyś na to spojrzał, a następnie zacznę kolejne pytanie, jeśli potrzebujesz dalszej pomocy. Wskazówka - sprawdź plik /wp-admin/includes/class-wp-posts-list-table.php, a jest nadrzędny.../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>';

}

Podczas korzystania z tego 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
pojawia się

Dostaję również ten sam błąd
Vasim Shaikh

0

Jeśli to nie działa dla nikogo, moje rozwiązanie wymagało dodania kolumny, którą próbowałem przefiltrować, do listy kolumn sortowalnych dla mojego niestandardowego typu postu.

// 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

Zastąp poniższe zapytanie, aby poprawić wpdb: przygotuj błąd:

$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
  );
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.