Filtra per campo personalizzato nel tipo di post personalizzato nella pagina di amministrazione


11

Ho usato i campi personalizzati avanzati per creare campi personalizzati per nome della competizione, risposte, ecc. Ho creato un tipo di post personalizzato per le competizioni come mostrato nell'immagine e ho usato Wordpress Functions.php per creare le colonne dai valori dei miei campi personalizzati.

Sto cercando di ottenere una casella a discesa "Filtra per" con le competizioni con nomi / etichette diversi come mostrato di seguito, ma posso trovare solo soluzioni che utilizzano tassonomie, che preferisco non usare se possibile perché ho usato solo campi personalizzati per tutto il resto.

È possibile creare un menu a discesa "Filtra per" personalizzato utilizzando solo i campi personalizzati?

Filtro Wordpress per


È possibile utilizzare il restrict_manage_postsgancio di azione per aggiungere ulteriori caselle a discesa. Non dimenticare che dovresti anche aggiungere un po 'di logica per il filtro, poiché WP non saprà cosa farne immediatamente (diversamente dagli elenchi a discesa della tassonomia, che può gestire automaticamente).
David Gard,

Come ulteriore pensiero: se lo desideri, puoi inserire il nome da collegare all'interno della tabella degli elenchi, il che significa che puoi filtrare un concorso facendo clic sul nome, anziché avere un menu a discesa.
David Gard,

Risposte:


12

E per visualizzare il risultato per Filtro, prova questo codice

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

Modificare la meta chiave e il meta valore come richiesto. Ho preso "nome concorso come meta_key e" nome concorso "come nome a discesa selezionato.


Bene, mi sentivo pigro, quindi gli ho suggerito di fare una domanda aggiuntiva;)
David Gard,

Sembra che le 2 risposte siano una risposta completa e dovrebbero essere combinate.
RCNeil,

10

Il restrict_manage_posts azione innesca la add_extra_tablenav()funzione, che è come si aggiungono ulteriori menù a discesa nella tua lista di tabella desiderata.

Nell'esempio seguente, assicuriamo innanzitutto che il tipo di post sia corretto, quindi prendiamo tutti i valori DB memorizzati nella competition_namechiave nella postmetatabella (è necessario modificare il nome della chiave come richiesto). La query è abbastanza semplice e controlla solo se il Concorso è pubblicato, accetta solo valori univoci (non vuoi duplicare nel menu a discesa) e poi li ordina in ordine alfabetico.

Quindi controlliamo i risultati (non serve a nulla mostrare il menu a discesa per nulla), quindi costruiamo le opzioni (incluso un valore predefinito per mostrare tutto). Alla fine viene visualizzato il menu a discesa.

Come affermato nel mio commento, questa non è la fine della storia; avrai bisogno di un po 'di logica per dire alla Tabella elenco di mostrare solo i risultati desiderati quando il filtro è attivo, ma ti lascio dare un'occhiata a questo e quindi farò un'altra domanda se hai bisogno di ulteriore assistenza. Suggerimento : controlla il file /wp-admin/includes/class-wp-posts-list-table.phped è padre.../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>';

}

Quando lo utilizzo, ricevo l'erroreNotice: 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,

Ricevo anche lo stesso errore
Vasim Shaikh il

0

Se questo non funziona per nessuno, la mia soluzione doveva aggiungere la colonna su cui stavo cercando di filtrare l'elenco delle colonne ordinabili per il mio tipo di post personalizzato.

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

Sostituisci la query di seguito per correggere il wpdb: preparare errore:

$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
  );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.