it-swarm.com.de

Filtern nach benutzerdefiniertem Feld im benutzerdefinierten Beitragstyp auf der Admin-Seite

Ich habe erweiterte benutzerdefinierte Felder verwendet, um benutzerdefinierte Felder für Wettbewerbsnamen, Antworten usw. zu erstellen. Ich habe einen benutzerdefinierten Beitragstyp für Wettbewerbe erstellt, wie auf dem Bild gezeigt, und ich habe Wordpress functions.php verwendet, um die Spalten aus meinen benutzerdefinierten Feldwerten zu erstellen.

Ich versuche, ein Dropdown-Feld "Filtern nach" mit den verschiedenen Namen/Bezeichnungen der Wettbewerbe (siehe unten) zu erhalten, aber ich kann nur Lösungen mit Taxonomien finden, die ich lieber nicht verwende wenn möglich weil ich ' Für alles andere haben wir nur benutzerdefinierte Felder verwendet.

Ist es möglich, ein benutzerdefiniertes Dropdown-Menü "Filtern nach" nur mit benutzerdefinierten Feldern zu erstellen?

 Wordpress filter by 

9
grAND

Und um das Ergebnis für Filter anzuzeigen, probieren Sie diesen Code

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

Ändern Sie den Metaschlüssel und den Metawert nach Bedarf. Ich habe "Wettbewerbsname als meta_key und" Wettbewerbsname "als ausgewählten Dropdown-Namen verwendet.

11
Aftab

Die Aktion restrict_manage_posts löst die Funktion add_extra_tablenav() aus, mit der Sie der gewünschten Listentabelle zusätzliche Dropdowns hinzufügen.

Im folgenden Beispiel stellen wir zunächst sicher, dass der Post-Typ korrekt ist, und greifen dann auf alle DB-Werte zu, die für den Schlüssel competition_name in der Tabelle postmeta gespeichert sind (Sie müssen den Schlüsselnamen nach Bedarf ändern). Die Abfrage ist ziemlich einfach und prüft nur, ob der Wettbewerb veröffentlicht ist, akzeptiert nur eindeutige Werte (Sie möchten keine Duplizierung in der Dropdown-Liste) und ordnet sie dann alphabetisch.

Als nächstes prüfen wir auf Ergebnisse (es macht keinen Sinn, das Dropdown für nichts auszugeben) und konstruieren dann die Optionen (einschließlich eines Defualts, um alle anzuzeigen). Schließlich wird das Dropdown ausgegeben.

Wie in meinem Kommentar erwähnt, ist dies jedoch nicht das Ende der Geschichte. Sie benötigen eine Logik, um der Listentabelle mitzuteilen, dass die gewünschten Ergebnisse nur angezeigt werden, wenn der Filter aktiv ist. Ich überlasse es Ihnen jedoch, dies zu überprüfen und eine weitere Frage zu stellen, wenn Sie weitere Unterstützung benötigen. Hinweis - checke die Datei /wp-admin/includes/class-wp-posts-list-table.php und ihren übergeordneten .../wp-class-list-table.php aus

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

    /** 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) :
        $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>';

}
9
David Gard

Wenn dies für niemanden funktioniert, musste meine Lösung die Spalte, nach der ich filtern wollte, zur Liste der sortierbaren Spalten für meinen benutzerdefinierten Beitragstyp hinzufügen.

// 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' );