Come ordinare l'area di amministrazione di WordPress un tipo di messaggio personalizzato da un campo personalizzato
-
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"> E la funzione posts_orderby
funzione
add_action('wp', 'check_page');
check_page
usato add_filter
per modificare la query, ma sono abbastanza sicuro che sarebbe solo lavoro in tema file, non nel settore amministrativo.
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:
(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:
- Siamo nel admin (
is_admin()
), - Siamo sulla pagina che elenca messaggi nella admin (
$pagenow=='edit.php'
), - La pagina è stata chiamata con un parametro URL
post_type
pari amovie
, e - 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:!):
(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.
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'