Come ordinare l'area di amministrazione di WordPress un tipo di messaggio personalizzato da un campo personalizzato

wordpress.stackexchange https://wordpress.stackexchange.com/questions/45

  •  16-10-2019
  •  | 
  •  

Domanda

Quando si modifica uno dei miei tipi di messaggi personalizzati Voglio essere in grado di elencare tutte le voci da un campo personalizzato al posto della data della loro pubblicazione (che, per un tipo di messaggio personalizzato, probabilmente non è rilevante). Ho avuto un vantaggio dai commenti di un post su tipi di messaggi personalizzati e l'autore ha detto che era possibile e che ha anche reso così è possibile fare clic sui nomi delle colonne per un ordinamento personalizzato. Egli ha menzionato la href="http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby"> posts_orderby funzione

add_action('wp', 'check_page');

E la funzione check_page usato add_filter per modificare la query, ma sono abbastanza sicuro che sarebbe solo lavoro in tema file, non nel settore amministrativo.

È stato utile?

Soluzione

Come potete immaginare dalla mancanza di risposte fornite, la soluzione non è esattamente banale. Quello che ho fatto è creare un esempio un po 'self-contained che assume un tipo messaggio personalizzato di "movie" e la chiave campo personalizzato di " genere ".

responsabilità :. Questo funziona con WP3.0, ma non posso essere sicuro che possa funzionare con le versioni precedenti

È praticamente necessario collegare due (2) ganci per farlo funzionare e altri due (2) per rendere evidente e utile.

Il primo gancio è 'restrict_manage_posts' che consente di emettere un <select> HTML nella zona sopra l'elenco dei posti dove i " Azioni in blocco " e " Mostra date " filtri. Il codice fornito genererà il " Ordina per: " funzionalità visto in questa schermata frammento:

Come creare Sort By funzionalità per un personalizzata tipo Share WordPress Admin
(fonte: mikeschinkel.com )

Il codice utilizza SQL diretto perché non c'è una funzione di WordPress API per fornire l'elenco di tutti gli meta_keys per tipi di messaggi (suona come un futuro biglietto trac a me ...) In ogni caso, ecco il codice. Si noti che afferra il tipo post dal $_GET e convalida per assicurarsi che sia una valida tipo messaggio post_type_exists(), oltre ad essere un tipo movie postale (i due controlli sono eccessivo, ma l'ho fatto per mostrare come se si vuole . il tipo di post) Infine io uso per codificare il parametro sortby URL, non è così in conflitto con qualsiasi altra cosa in WordPress:

add_action('restrict_manage_posts','restrict_manage_movie_sort_by_genre');
function restrict_manage_movie_sort_by_genre() {
    if (isset($_GET['post_type'])) {
        $post_type = $_GET['post_type'];
        if (post_type_exists($post_type) && $post_type=='movie') {
            global $wpdb;
            $sql=<<<SQL
SELECT pm.meta_key FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON p.ID=pm.post_id
WHERE p.post_type='movie' AND pm.meta_key='Genre'
GROUP BY pm.meta_key
ORDER BY pm.meta_key
SQL;
            $results = $wpdb->get_results($sql);
            $html = array();
            $html[] = "<select id=\"sortby\" name=\"sortby\">";
            $html[] = "<option value=\"None\">No Sort</option>";
            $this_sort = $_GET['sortby'];
            foreach($results as $meta_key) {
                $default = ($this_sort==$meta_key->meta_key ? ' selected="selected"' : '');
                $value = esc_attr($meta_key->meta_key);
                $html[] = "<option value=\"{$meta_key->meta_key}\"$default>{$value}</option>";
            }
            $html[] = "</select>";
            echo "Sort by: " . implode("\n",$html);
        }
    }
}

Il passo secondo richiesta è quello di utilizzare il gancio parse_query che viene chiamato dopo che WordPress decide una cosa query viene dovrebbe correre, ma prima che si esegue la query. Qui si arriva a valori impostati di orderby e meta_key in ordine query_var della query che sono documentato nel Codice nel parametro orderby per query_posts(). Ci prova a fare in modo che:

  1. Siamo nel admin (is_admin()),
  2. Siamo sulla pagina che elenca messaggi nella admin ($pagenow=='edit.php'),
  3. La pagina è stata chiamata con un parametro URL post_type pari a movie, e
  4. La pagina è stata anche chiamata con un parametro sortby URL e che non è stato superato un valore di ' Nessuno '

Se tutti i test passano abbiamo quindi impostare la query_vars (come documentato qui ) al meta_value e il nostro valore sortby per ' genere ':

add_filter( 'parse_query', 'sort_movie_by_meta_value' );
function sort_movie_by_meta_value($query) {
    global $pagenow;
    if (is_admin() && $pagenow=='edit.php' &&
        isset($_GET['post_type']) && $_GET['post_type']=='movie' && 
        isset($_GET['sortby'])  && $_GET['sortby'] !='None')  {
        $query->query_vars['orderby'] = 'meta_value';
        $query->query_vars['meta_key'] = $_GET['sortby'];
    }
}

E questo è tutto quello che dovete fare; no "posts_order" o ganci "wp" richiesto! Certo che in realtà c'è bisogno di fare di più; è necessario aggiungere alcune colonne nella pagina che elenca i messaggi in modo da poter effettivamente vedere i valori che esso è l'ordinamento per gli utenti altrimenti avranno mucho confuso. Quindi aggiungere un gancio manage_{$post_type}_posts_columns, in questo caso manage_movie_posts_columns. Questo hook viene passato l'array predefinito di colonne e per semplicità Ho appena sostituito con due colonne standard; una casella di controllo (cb) e un nome postale (title). (È possibile controllare posts_columns con un print_r() di vedere cos'altro è disponibile di default.)

ho deciso di aggiungere un " Ordinati per: " per quando c'è un parametro sortby URL e, quando non è None:

add_action('manage_movie_posts_columns', 'manage_movie_posts_columns');
function manage_movie_posts_columns($posts_columns) {
    $posts_columns = array(
        'cb' => $posts_columns['cb'],
        'title' => 'Movie Name',
        );
    if (isset($_GET['sortby']) && $_GET['sortby'] !='None') 
        $posts_columns['meta_value'] = 'Sorted By';

    return $posts_columns;
}

Infine usiamo il gancio manage_pages_custom_column nel visualizzare il valore quando v'è un posto di tipo palo appropriato e con il test probabilmente ridondante per is_admin() e $pagenow=='edit.php'. Quando v'è un parametro sortby URL si estrae il valore del campo personalizzato che viene allineati secondo un display nella nostra lista. Ecco come si presenta (ricordate, si tratta di dati di test in modo da commenti dal loggione sulle classificazioni dei film:!):

colonne personalizzate aggiunto per un tipo di messaggio personalizzato in WordPress Admin
(fonte: mikeschinkel.com )

E qui è il codice:

add_action('manage_pages_custom_column', 'manage_movie_pages_custom_column',10,2);
function manage_movie_pages_custom_column($column_name,$post_id) {
    global $pagenow;
    $post = get_post($post_id);
    if ($post->post_type=='movie' && is_admin() && $pagenow=='edit.php')  {
        switch ($column_name) {
            case 'meta_value':
                if (isset($_GET['sortby']) && $_GET['sortby'] !='None') {
                    echo get_post_meta($post_id,$_GET['sortby'],true);
                }
                break;
        }
    }
}

Si noti che questo rileva solo la prima " genere " per un movie, cioè la prima meta_value nel caso di più valori per una determinata chiave. Ma poi di nuovo io non sono sicuro di come sarebbe lavorare altrimenti!

E per chi non conosce dove mettere questo codice si può mettere in un plugin o più probabilmente per i newbie nel file functions.php nel vostro tema corrente.

Come questo aiuta.

Altri suggerimenti

Come di WordPress 3.1 (sto usando la versione beta) colonne possono ora essere ordinabili tramite i loro titoli.

Di seguito i dettagli pubblicare come implementarli.

http://scribu.net/wordpress/custom-sortable-columns.html

Ecco una soluzione semplice:

/* --------Sortable Events on Dashboard - show start date, time, venue--------- */

/*-------------------------------------------------------------------------------
    Custom Columns
-------------------------------------------------------------------------------*/

function my_*YOUR POST TYPE*_columns($columns)
{
    $columns = array(
        'cb'        => '<input type="checkbox" />',
        'title'     => 'Title',
        'your_custom_field'     => 'Custom Field Name',          
        'date'      =>  'Date',
    );
    return $columns;
}

function my_custom_columns($column)
{
    global $post;
    if($column == 'your_custom_field')
    {
        if(get_post_meta($post->ID, 'your_custom_field', true);)
        {
            echo get_post_meta($post->ID, 'your_custom_field', true);
        }
    }

}

add_action("manage_posts_custom_column", "my_custom_columns");
add_filter("manage_edit-*YOUR POST TYPE*_columns", "my_events_columns");

/*-------------------------------------------------------------------------------
    Sortable Columns
-------------------------------------------------------------------------------*/

function my_column_register_sortable( $columns )
{
    $columns['your_custom_field'] = 'your_custom_field';
    return $columns;
}

add_filter("manage_edit-*YOUR POST TYPE*_sortable_columns", "my_column_register_sortable" );

Basta sostituire Il tuo post TIPO e 'your_custom_field'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a wordpress.stackexchange
scroll top