web-dev-qa-db-fra.com

Définir la liste par défaut "View" dans Admin

Je cherche un moyen de définir les options "Affichage" par défaut sous les types de publication dans la zone d'administration. Par exemple, par défaut, Postes affichera par défaut une vue "liste" au lieu d'un "extrait" - j'aimerais changer ceci en extrait par défaut - quel serait le meilleur moyen d'y parvenir? J'ai fait quelques recherches à ce sujet, mais je suis coincé dans la boue jusqu'à présent. Toute aide serait grandement appréciée. Merci!

7
Zach

Bien que Nice ait la fonctionnalité de paramètres persistants dans le noyau, cela peut prendre un certain temps avant qu’elle soit réellement acceptée. WordPress 3.5 est encore assez loin.

Augmentons donc le tableau global $_REQUEST à la place.

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

Cela va verrouiller les modes, forçant le mode excerpt tout le temps, laissez donc l'utilisateur décider mais maintenez-le persistant à l'aide des 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 interpoler davantage post_type en prenant en compte la variable $_GET['post_type'] 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 message par utilisateur, pas de piratage.

9
soulseekah

L'écran de vue de publication bascule de la vue liste à la vue extrait 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 est not filterable, il n’existe donc aucun moyen facile de le contrôler par programme.

Donc, je vais 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.php et recherchez la méthode prepare_items() (autour de la ligne 81).

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

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

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

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

Maintenant, allez dans le fichier functions.php 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 raccordera au filtre et retournera le mode extrait par défaut.

Comme ma règle personnelle concernant le piratage de Core exige que tous les piratages soient réintroduits dans le projet (ils peuvent ainsi être intégrés dans Core et ne plus être considérés comme un piratage), j'ai ouvert un ticket Trac pour cette amélioration et soumis le code ci-dessus sous forme de correctif. Veuillez peser sur le ticket pour qu'il puisse entrer dans le noyau pour la version 3.5 (nous sommes trop en retard pour le cycle 3.4, mais nous pouvons essayer de faire passer cela à travers pour la prochaine version).

5
EAMann

Ok, donc peu de temps après avoir mis une prime, j'ai proposé la solution suivante. C'est le comportement par défaut dans tous les sens, sauf qu'il sélectionne la vue extrait pour le type de publication que vous voulez (au lieu de la 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;
        }
    }
}

?>

NOTE: Je recommande l'approche de Soulseekah. Si vous ne voulez pas que l'utilisateur se souvienne du choix de l'utilisateur, vous pouvez intégrer un peu mon code à son code. NOTE 2: Si/quand le patch d’EAMann fait partie du noyau, sa méthode serait évidemment la meilleure car elle n’exigerait pas que vous fassiez un long chemin. Je n'aime pas ça pour le moment car il faut éditer les fichiers core.

2
Hosh Sadiq