Legen Sie in Admin die Standardliste "Ansicht" fest

8

Ich suche nach einer Möglichkeit, die Standardoptionen für "Ansicht" unter Beitragstypen im Administratorbereich festzulegen. Beispielsweise wird für Posts standardmäßig eine "Listen" -Ansicht anstelle von "Auszug" verwendet. Ich möchte dies standardmäßig in einen Auszug ändern. Wie kann dies am besten erreicht werden? Ich habe ein bisschen danach gesucht, bin aber bisher im Schlamm gefangen. Jede Hilfe wäre sehr dankbar. Vielen Dank!

Zach
quelle

Antworten:

9

Obwohl es gut ist, die Funktion der dauerhaften Einstellungen im Kern zu haben, kann es eine Weile dauern, bis sie tatsächlich akzeptiert werden. WordPress 3.5 ist noch ziemlich weit weg.

Erweitern wir $_REQUESTstattdessen das globale Array.

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

Dadurch werden die Modi gesperrt und der excerptModus wird ständig erzwungen. Lassen Sie uns also den Benutzer entscheiden, aber halten Sie ihn unter Verwendung der Metadaten des Benutzers dauerhaft:

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;
}

Sie können weiter post_typein alle interpolieren, indem Sie die $_GET['post_type']Variable berücksichtigen, sofern verfügbar.

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! Permanenter Listenmodus pro Beitragstyp pro Benutzer, keine Hacks.

Soulseekah
quelle
1
Gute Lösung. Kurz nachdem ich ein Kopfgeld dafür gezahlt hatte, wurde es viel einfacher! Aber da Sie die Lösung haben, gebe ich Ihnen das Kopfgeld, obwohl ich denke, dass ich stattdessen Ihren Weg einbeziehen werde, da dies tatsächlich hartnäckig ist und nicht dem Standardverhalten entspricht, außer mit einem Auszug anstelle einer Liste. Bearbeiten, kann es in 17 Stunden vergeben, also nimm es mit mir!
Hosh Sadiq
Vielen Dank, ich bin froh, Ihnen geholfen zu haben. Eine sehr interessante Frage.
Soulseekah
Danke für dieses @soulseekah, ich habe es auch benutzt und es funktioniert großartig. Wie Sie damals erwähnt haben "WordPress 3.5 ist noch ziemlich weit weg" - ist dieser Code noch gut mit der neuesten WordPress-Version zu verwenden?
user3438958
5

Der Bildschirm für die Nachansicht wechselt basierend auf dem Wert des Parameters "mode" in der Abfragezeichenfolge von der Listenansicht zur Ausschnittsansicht. Wenn der Parameter "mode" nicht eingestellt ist, verwendet WordPress standardmäßig die Listenansicht.

Leider kann dieser Parameter nicht gefiltert werden, sodass es keine einfache Möglichkeit gibt, ihn programmgesteuert zu steuern.

Also werde ich etwas tun, was ich nie tue ... Ich werde dir sagen, wie man Core hackt, damit das funktioniert ...

Filter hinzufügen

Öffnen Sie /wp-admin/includes/class-wp-posts-list-table.phpund finden Sie die prepare_items()Methode (um Zeile 81).

In Zeile 99 prüft WordPress, ob der Parameter "mode" in der Anforderung festgelegt wurde oder nicht, und verwendet diesen, um die globale $modeVariable festzulegen:

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

Wir werden diese Zeile ändern, um die Standardeinstellung zu filtern. Ändern Sie diese Zeile in:

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

Gehen Sie nun in die functions.phpDatei Ihres Themas und fügen Sie den folgenden Code hinzu:

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

Dadurch wird der Filter angeschlossen und der Auszugsmodus wird standardmäßig zurückgegeben.

Da meine persönliche Regel zum Hacken von Core erfordert, dass alle Hacks wieder in das Projekt eingebracht werden (auf diese Weise können sie in Core gerollt werden und nicht mehr als Hack gelten), habe ich ein Trac-Ticket für diese Verbesserung geöffnet und den obigen Code übermittelt als Patch. Bitte wiegen Sie das Ticket ab, damit es für 3.5 in den Kern gelangt (für 3.4 sind wir zu spät im Zyklus, aber wir können versuchen, dies für die nächste Version durchzusetzen).

EAMann
quelle
1
Sehr cool. Denken Sie auf jeden Fall, dass "dies" ein Grund ist, den Kern zu hacken - also müssen Sie es in Zukunft nicht mehr tun :)
Zach
1
Es gibt auch eine laufende Diskussion über dieses Ticket - plus einen weiteren Patch, der eine Benutzeroption anstelle nur eines Filters vorschlägt. Bitte behalten Sie diese Konversation im Auge, wenn Sie sich entscheiden, Core tatsächlich zu hacken ... denn wenn sich die Dinge in einer zukünftigen Version ändern, müssen Sie auch Ihren Code ändern.
EAMann
Warum nicht einfach das $_REQUESTGlobale hacken add_action( 'edit.php', ... )und dergleichen, während wir darauf warten, dass der Kern den Patch / Vorschlag annimmt?
Soulseekah
@Soulseekah Gute Alternative ... nur kein Fan davon, das $_REQUESTObjekt selbst zu hacken . Sie können gerne eine weitere Antwort veröffentlichen, in der erläutert wird, wie dies getan werden kann.
EAMann
1
+1, um es mit einigen großartigen Patches auf den Weg zum Kern zu bringen. Hoffentlich werden wir die Änderungssätze bald sehen.
Soulseekah
2

Okay, kurz nachdem ich ein Kopfgeld gezahlt hatte, kam ich auf die folgende Lösung. Dies ist in jeder Hinsicht das Standardverhalten, mit der Ausnahme, dass die Auszugsansicht für den gewünschten Beitragstyp ausgewählt wird (anstelle der Standardlistenansicht).

<?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;
        }
    }
}

?>

HINWEIS: Ich empfehle Soulseekahs Ansatz. Wenn Sie nicht möchten, dass er sich an die Wahl des Benutzers erinnert, können Sie meinen Code ein wenig in seinen Code integrieren. ANMERKUNG 2: Wenn / wenn EAManns Patch Teil des Kerns ist, wäre seine Methode offensichtlich die beste, da Sie nicht den weiten Weg gehen müssten. Ich mag es im Moment einfach nicht, da Sie die Kerndateien bearbeiten müssen.

Hosh Sadiq
quelle
1
Das macht Sinn. Wird pagedjedoch nicht berücksichtigt (Paginierung) + wäre die Verwendung wp_redirectanstelle von rohen Headern möglicherweise etwas "sauberer", und ich bin mir nicht sicher, wie effizient die Umleitung ist. Davon abgesehen sieht es interessant aus. Auch $_GET['post_type']könnte nicht eingestellt werden, in einer Warnung ergibt , wenn Fehler eingeschaltet sind. +1 für die Mühe und die Geduld. Ich wusste nicht, dass die Frage so alt war.
Soulseekah
2
Mein Problem bei diesem Ansatz ist, dass es sich um eine Umleitung handelt. Sie laden WP also nicht nur einmal, sondern zweimal , um zur Seite mit den Post-Listen zu gelangen.
EAMann
@Soulseekah, Sie haben Recht, ich habe nicht gedacht, dass ich den Code aktualisiert habe, um alle $_GETVariablen zu berücksichtigen . Wie für das $_GET['post_type'], ehrlich gesagt, war ich auch nicht , dass die Mühe gemacht , wie ich es nur erforderlich für einen benutzerdefinierten Post - Typ zu sein, die immer da sein würde. Offensichtlich kann dies weggelassen werden. @ EAMann, Sie haben Recht, dies war jedoch die beste Lösung, die ich finden konnte. Ich habe versucht, $_GETParameter manuell einzustellen, in der Hoffnung, dass sie vor dem Lesen eingestellt werden, aber dies schien nicht der Fall zu sein.
Hosh Sadiq