Définir la liste par défaut «Afficher» dans Admin

8

Je cherche un moyen de définir les options "Afficher" par défaut sous les types de publication dans la zone d'administration. Par exemple, par défaut, les publications utiliseront par défaut une vue "liste" au lieu d '"extrait" - je voudrais changer cela en extrait par défaut - quelle serait la meilleure façon d'y parvenir? J'ai fait un peu de recherche là-dessus, mais je suis coincé dans la boue jusqu'à présent. Toute aide serait grandement appréciée. Merci!

Zach
la source

Réponses:

9

Bien que la fonctionnalité de paramètres persistants dans le noyau soit agréable, cela peut prendre un certain temps avant d'être réellement accepté. WordPress 3.5 est encore assez loin.

Augmentons donc le $_REQUESTtableau global à la place.

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

Cela verrouillera les modes, forçant le excerptmode tout le temps, nous allons donc laisser l'utilisateur décider mais le garder persistant en utilisant les métadonnées de l'utilisateur:

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

Vous pouvez encore interpoler post_typeen tout en tenant compte de la $_GET['post_type']variable lorsqu'elle est disponible.

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

Alto! Mode liste persistante par type de publication par utilisateur, pas de piratage.

soulseekah
la source
1
Bonne solution. J'ai obtenu beaucoup plus facile peu de temps après avoir mis une prime sur cela! Mais, puisque vous avez la solution, je vous donnerai la prime, bien que je pense que j'intégrerai votre chemin à la place car cela est en fait persistant plutôt que comme le comportement par défaut, sauf avec un extrait au lieu de la liste. Modifier, peut l'attribuer en 17 heures, alors restez avec moi!
Hosh Sadiq
Merci, heureux d'avoir été utile. Une question très intéressante.
soulseekah
Merci pour ce @soulseekah, je l'ai utilisé aussi et fonctionne très bien. Comme vous l'avez mentionné à l'époque "WordPress 3.5 est encore assez loin" - ce code est-il toujours bon à utiliser avec la dernière version de WordPress?
user3438958
5

L'écran de post-visualisation bascule de la vue de liste à la vue d'extraits en fonction de la valeur du paramètre "mode" dans la chaîne de requête. Si le paramètre "mode" n'est pas défini, WordPress utilise par défaut la vue liste.

Malheureusement, ce paramètre n'est pas filtrable, il n'y a donc pas de moyen facile de le contrôler par programme.

Je vais donc faire quelque chose que je ne fais jamais ... Je vais vous dire comment pirater Core pour que cela fonctionne ...

Ajout d'un filtre

Ouvrez /wp-admin/includes/class-wp-posts-list-table.phpet trouvez la prepare_items()méthode (autour de la ligne 81).

Sur la ligne 99, WordPress vérifie si le paramètre "mode" a été défini ou non dans la demande et l'utilise pour définir la $modevariable globale :

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

Nous allons modifier cette ligne pour filtrer le paramètre par défaut. Changez cette ligne en:

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

Maintenant, allez dans le functions.phpfichier de votre thème et ajoutez le code suivant:

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

Cela se connectera au filtre et renverra le mode extrait par défaut.

Étant donné que ma règle personnelle sur le piratage de Core nécessite que tous les hacks soient redirigés vers le projet (de cette façon, ils peuvent être intégrés dans Core et ne plus être considérés comme un hack), j'ai ouvert un ticket Trac pour cette amélioration et soumis le code ci-dessus comme un patch. Veuillez peser sur le ticket afin qu'il puisse entrer dans le noyau pour la 3.5 (nous sommes trop tard dans le cycle pour la 3.4, mais nous pouvons essayer de le faire passer pour la prochaine version).

EAMann
la source
1
Très cool. Je pense vraiment que "ceci" est une raison de pirater le noyau - donc à l'avenir, vous n'aurez pas à le faire :)
Zach
1
Il y a également une discussion en cours sur ce ticket - plus un autre correctif proposant une option utilisateur au lieu d'un simple filtre. Veuillez garder une trace de cette conversation si vous décidez de pirater réellement Core ... car si / quand les choses changent dans une future version, vous devrez également changer votre code.
EAMann
Pourquoi ne pas simplement pirater le $_REQUESTglobal add_action( 'edit.php', ... )et ainsi de suite, en attendant que le noyau adopte le patch / la proposition?
soulseekah
@Soulseekah Bonne alternative ... tout simplement pas un fan de pirater l' $_REQUESTobjet moi-même. N'hésitez pas à poster une autre réponse décrivant comment cela pourrait être fait.
EAMann
1
+1 pour l'avoir mis sur la route avec des correctifs géniaux, j'espère que nous verrons bientôt les changements.
soulseekah
2

D'accord, donc peu de temps après avoir mis une prime, j'ai trouvé la solution suivante. C'est le comportement par défaut dans tous les sens, sauf qu'il sélectionne la vue d'extrait pour le type de publication que vous voulez (au lieu de la vue de liste par défaut).

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

?>

REMARQUE: je recommande l'approche de Soulseekah, si vous ne voulez pas qu'il se souvienne du choix de l'utilisateur, vous pouvez incorporer un peu mon code avec son code. NOTE 2: Si / quand le patch d'EAMann fait partie du noyau, sa méthode serait évidemment la meilleure car elle ne vous obligerait pas à parcourir le long chemin. Je n'aime pas ça pour le moment car vous devez éditer les fichiers principaux.

Hosh Sadiq
la source
1
C'est logique. Cependant, pagedn'est pas pris en compte (pagination) + l'utilisation wp_redirectau lieu d'en-têtes bruts pourrait être un peu plus "propre", et je ne suis pas sûr de l'efficacité de la redirection. A part ça, ça a l'air intéressant. Il se $_GET['post_type']peut également que ce paramètre ne soit pas défini, ce qui entraîne un avertissement si les erreurs sont activées. +1 pour l'effort et la patience. Je ne savais pas que la question était si ancienne.
soulseekah
2
Mon problème avec cette approche est qu'elle implique une redirection. Vous ne chargez donc pas WP une fois, mais deux fois juste pour accéder à la page de liste des articles.
EAMann
@Soulseekah, vous avez raison, je n'y ai pas réfléchi, j'ai mis à jour le code pour prendre en compte toutes les $_GETvariables. En ce qui concerne $_GET['post_type'], honnêtement, cela ne m'a pas trop dérangé car j'ai seulement exigé que ce soit pour un type de message personnalisé, qui serait toujours là. Évidemment, cela peut être omis. @EAMann, vous avez raison, cependant, c'était la meilleure solution que j'ai pu trouver. J'ai essayé de régler manuellement les $_GETparamètres, en espérant qu'il serait réglé AVANT qu'il ne soit lu, mais cela ne semblait pas être le cas.
Hosh Sadiq