Impostare l'elenco predefinito "Visualizza" in Amministratore


8

Sto cercando un modo per impostare le opzioni "Visualizza" predefinite sotto i tipi di post nell'area di amministrazione. Ad esempio, per impostazione predefinita, per impostazione predefinita, Posts visualizzerà una visualizzazione "elenco" anziché "estratto". Vorrei modificarlo in estratto per impostazione predefinita: quale sarebbe il modo migliore per raggiungere questo obiettivo? Ho fatto un po 'di ricerche su questo, ma finora sono bloccato nel fango. Qualsiasi aiuto sarebbe molto apprezzato. Grazie!

Risposte:


9

Sebbene la funzionalità di impostazioni persistenti nel core sia piacevole, potrebbe essere necessario un po 'di tempo prima che venga effettivamente accettata. WordPress 3.5 è ancora abbastanza lontano.

Aumentiamo $_REQUESTinvece l'array globale .

add_action( 'load-edit.php', 'wpse34956_force_excerpt' );
function wpse34956_force_excerpt() {
    $_REQUEST['mode'] = 'excerpt';
}

Questo bloccherà le modalità, forzando sempre la excerptmodalità, quindi giriamo lasciamo che l'utente decida ma manteniamolo persistente usando i metadati dell'utente:

add_action( 'load-edit.php', 'wpse34956_persistent_posts_list_mode' );
function wpse34956_persistent_posts_list_mode() {
    if ( isset( $_REQUEST['mode'] ) ) {
        // save the list mode
        update_user_meta( get_current_user_id(), 'posts_list_mode', $_REQUEST['mode'] );
        return;
    }
    // retrieve the list mode
    if ( $mode = get_user_meta( get_current_user_id(), 'posts_list_mode', true ) )
        $_REQUEST['mode'] = $mode;
}

Puoi interpolare ulteriormente post_typein tutto prendendo in considerazione la $_GET['post_type']variabile quando disponibile.

add_action( 'load-edit.php', 'wpse34956_persistent_posts_list_mode' );
function wpse34956_persistent_posts_list_mode() {

    // take into account post types that support excerpts
    $post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';
    if ( $post_type && !post_type_supports( $post_type, 'excerpt' ) )
        return; // don't care

    if ( isset( $_REQUEST['mode'] ) ) {
        // save the list mode
        update_user_meta( get_current_user_id(), 'posts_list_mode' . $post_type, $_REQUEST['mode'] );
        return;
    }

    // retrieve the list mode
    if ( $mode = get_user_meta( get_current_user_id(), 'posts_list_mode' . $post_type, true ) )
        $_REQUEST['mode'] = $mode;
}

Viola! Modalità elenco persistente per tipo di post per utente, senza hack.


1
Buona soluzione È diventato molto più facile poco dopo che ho messo una taglia su questo! Ma, dato che hai la soluzione, ti darò la generosità, anche se penso che incorporerò la tua strada invece che è effettivamente persistente piuttosto che come il comportamento predefinito, tranne con estratto invece di elenco. Modifica, puoi premiarlo in 17 ore quindi abbi pazienza!
Hosh Sadiq,

Grazie, felice di essere stato di aiuto. Una domanda molto interessante
soulseekah,

Grazie per questo @soulseekah, ho usato anche questo e funziona benissimo. Come hai detto all'epoca "WordPress 3.5 è ancora abbastanza lontano" - questo codice è ancora buono da usare con l'ultima versione di WordPress?
user3438958

5

La schermata della vista post passa dalla vista elenco alla vista estratto in base al valore del parametro "mode" nella stringa di query. Se il parametro "mode" non è impostato, per impostazione predefinita WordPress visualizza la lista.

Sfortunatamente, questo parametro non è filtrabile, quindi non esiste un modo semplice per controllarlo programmaticamente.

Quindi farò qualcosa che non faccio mai ... Ti dirò come hackerare Core per farlo funzionare ...

Aggiungere un filtro

Apri /wp-admin/includes/class-wp-posts-list-table.phpe trova il prepare_items()metodo (attorno alla linea 81).

Nella riga 99, WordPress verifica se il parametro "mode" è stato impostato nella richiesta o meno e lo utilizza per impostare la $modevariabile globale :

$mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];

Modificheremo questa linea per filtrare l'impostazione predefinita. Cambia questa riga in:

$mode = empty( $_REQUEST['mode'] ) ? apply_filters( 'default-posts-list-mode', 'list' ) : $_REQUEST['mode'];

Ora, vai nel functions.phpfile del tuo tema e aggiungi il seguente codice:

add_filter( 'default-posts-list-mode', 'my_default_posts_list_mode' );
function my_default_posts_list_mode( $default ) {
    return 'excerpt';
}

Questo si collegherà al filtro e tornerà alla modalità estratto per impostazione predefinita.

Dal momento che la mia regola personale sull'hacking di Core richiede che tutti gli hack vengano restituiti al progetto (in questo modo possono essere inseriti in Core e non contano più come hack), ho aperto un ticket Trac per questo miglioramento e inviato il codice sopra come patch. Ti preghiamo di ponderare il ticket in modo che possa entrare nel core per 3.5 (siamo in ritardo nel ciclo per 3.4, ma possiamo provare a passare attraverso la prossima versione).


1
Molto bello. Sicuramente "questo" è un motivo per hackerare il core, quindi in futuro non devi farlo :)
Zach

1
Sono in corso discussioni anche su questo ticket, oltre a un'ulteriore patch che propone un'opzione utente anziché solo un filtro. Tieni traccia di quella conversazione se decidi di hackerare Core ... perché se / quando le cose cambieranno in una versione futura, dovrai cambiare anche il tuo codice.
EAMann

Perché non solo hackerare il $_REQUESTglobale add_action( 'edit.php', ... )e simili, mentre aspettiamo che core adotti la patch / proposta?
soulseekah,

@Soulseekah Buona alternativa ... non sono un fan di hackerare l' $_REQUESToggetto da solo. Sentiti libero di pubblicare un'altra risposta che delinea come potrebbe essere fatto.
EAMann

1
+1 per averlo portato sulla strada del core con alcune ottime patch, speriamo di vedere presto i changeset.
soulseekah,

2

Ok, così poco dopo ho messo una taglia, ho trovato la seguente soluzione. È il comportamento predefinito in tutti i modi, tranne per il fatto che seleziona la vista di estratto per qualsiasi tipo di post desiderato (anziché la vista elenco predefinita).

<?php

add_action( 'admin_init', 'my_admin_init' ); // initiate admin hook

function my_admin_init() {
    // if mode is not set redirect to a default mode.
    if(!isset($_GET['mode'])) {
        if('forms' == $_GET['post_type'] || 'client-quotes' == $_GET['post_type'] ) {
            wp_redirect( admin_url( 'edit.php?mode=excerpt&' . http_build_query( $_GET ) ) );
            exit;
        }
    }
}

?>

NOTA: raccomando l'approccio di Soulseekah, se non vuoi che ricordi la scelta dell'utente, puoi incorporare un po 'il mio codice con il suo codice. NOTA 2: Se / quando la patch di EAMann fa parte del core, ovviamente il suo metodo sarebbe il migliore in quanto non richiederebbe di fare il giro lungo. Al momento non mi piace perché devi modificare i file core.


1
Questo ha senso. Tuttavia, pagednon viene preso in considerazione (impaginazione) + l'utilizzo al wp_redirectposto delle intestazioni non elaborate potrebbe essere un po 'più "pulito", e non sono sicuro di quanto sia efficiente il reindirizzamento. Diverso da quello che sembra interessante. Inoltre, $_GET['post_type']potrebbe non essere impostato, causando un avviso se gli errori sono attivati. +1 per lo sforzo e la pazienza. Non avevo capito che la domanda era così vecchia.
soulseekah,

2
Il mio problema con questo approccio è che comporta un reindirizzamento. Quindi stai caricando WP non una volta, ma due volte solo per accedere alla pagina dell'elenco dei post.
EAMann

@Soulseekah, hai ragione, non ci ho pensato, ho aggiornato il codice per tenere conto di tutte le $_GETvariabili. Per quanto riguarda il $_GET['post_type'], onestamente, non ero troppo infastidito da quello in quanto avevo solo bisogno che fosse per un tipo di post personalizzato, che sarebbe sempre stato lì. Ovviamente questo può essere omesso. @EAMann, hai ragione, tuttavia, questa è stata la soluzione migliore che ho potuto trovare. Ho provato a impostare manualmente i $_GETparametri, sperando che fosse impostato PRIMA che fosse letto, ma questo non sembrava essere il caso.
Hosh Sadiq,
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.