web-dev-qa-db-fra.com

Créer une page parent "factice" pour une hiérarchie dans la liste des pages?

Est-il possible de configurer une page "fictive" - ​​juste un titre de page qui apparaît dans la liste des pages, et une page qui n'est pas modifiable et qui n'a pas de slug?

C'est plutôt une question hypothétique, car je ne sais pas par où commencer avec le code ni déterminer la meilleure voie à suivre.

J'aimerais avoir la possibilité de configurer une telle hiérarchie parent/enfant dans la liste de pages afin que les pages enfants tombent sous le parent, mais la page parent n'est qu'un espace réservé et non une vraie page.

La raison: pour les utilisateurs peu expérimentés dans WordPress, il est utile d'organiser les pages dans une hiérarchie parent/enfant - en particulier s'il y a beaucoup de pages - afin que les pages associées soient mieux organisées dans la liste de pages. Les utilisateurs peuvent également visualiser la création d'un menu si les pages enfants sont organisées sous un parent. Le problème est que la page parent peut être modifiable et ne pas faire partie du contenu de la page établie, ce qui, selon mon expérience, entraîne la confusion de l'utilisateur.

Je peux utiliser une fonction pour supprimer l'éditeur d'une page spécifique et utiliser entires dans le fichier robots.txt pour ne pas indexer le parent factice, mais cela implique de les modifier pour un nouveau parent. Et cette page parent a toujours une limace, même si elle est bloquée

Y a-t-il moyen de créer une fonction qui crée un titre de page et qui permet d’attribuer des pages enfants, mais qui a la page parent inopenable, non éditable et n’a pas de slug?

enter image description here

6
markratledge

OK voici ma tentative, c’est plutôt hacky et à la fin je n’ai pas pu supprimer le lien/la couleur de l’élément parent, mais le lien parent ne fonctionnera pas .. donc ça marche un peu.

Commencez par créer un CPT avec le jeu de paramètres suivant:

$args = array( 
        'hierarchical'        => true,
        'public'              => false,
        'show_ui'             => true,
        'show_in_menu'        => true,
        'capability_type'     => 'post', 
        'supports'            => array( 'title','page-attributes' ),
    );

Remplissez le reste au besoin, cela vous permettra d'avoir une publication/page parent qui s'affiche dans l'admin, mais pas sur le front-end, cela permet également aux fonctionnalités parent via page-attributes.

Nous pouvons maintenant ajouter un filtre qui supprime les petits liens "edit", "view" et "trash" pour le parent.

function wpse_95518($actions) {

    global $post;

    //rename this to your CPT 
    if ($post->post_type =="parent"){
        // check if it's a parent
        if ( ! (is_post_type_hierarchical('parent') && $post->post_parent )) {

            unset( $actions['inline hide-if-no-js']);
            unset( $actions['trash'] );
            unset( $actions['view'] );  
            unset( $actions['edit'] );
        }           
        return $actions;
    }
    return $actions; 
}

add_filter('page_row_actions', 'wpse_95518');

Maintenant, les choses deviennent un peu funky, pour supprimer la fonctionnalité de lien de titre parent pour modifier la publication.

function wpse_removetitle_95518($action){

    global $post; 

    if ($post->post_type =="parent"){
        if ( is_post_type_hierarchical('parent') && $post->post_parent ) {
            return $action;
        }else{
            return '#'; //just in case
        }
    }
    return $action;
 }
add_filter( 'get_edit_post_link', 'wpse_removetitle_95518');

Désormais, les éléments parents du CPT ne devraient pas être modifiables via des liens dans l’administrateur, il s’affichera sous la forme edit.php?post_type=parent# mais les enfants iront bien.

L'inconvénient est que l'élément parent sera toujours un lien bleu au lieu d'un texte noir. Je ne trouvais aucun moyen simple de supprimer le lien du titre ou d'ajouter du CSS personnalisé pour le faire via javascript sans étendre le WP List Table.

Vous pouvez bien sûr modifier le titre parent en utilisant le filtre the_title, mais même en le réglant sur NULL via la condition ci-dessus, le < a href=..> reste affiché.

En outre, il pourrait y avoir un moyen plus simple de faire tout cela en utilisant simplement le filtre is_post_type_hierarchical.

Github lien vers Table Class code pour le titre.

2
Wyck