web-dev-qa-db-fra.com

Comment créer un type de publication personnalisé sans laisser Wordpress attribuer une URL

Laissez-moi vous donner un scénario de ce que j'essaie de faire. J'ai un type de message personnalisé "client" et je peux entrer et "ajouter un nouveau client". Ici, je vois mes champs personnalisés tels que nom, logo, avis, etc. Le problème est que Wordpress génère une URL pour cela. Ceci n'est pas censé être une page, je redirige donc simplement tout mon http://website.com/customers/ * vers un autre endroit afin que personne ne puisse accéder à ces pages (pour l'instant).

Existe-t-il un moyen lors de l’enregistrement de mes types de publication personnalisés dans le fichier functions.php (ou d’une autre manière) d’indiquer à Wordpress de ne pas générer d’URL/de page réelle? C'est vraiment juste une fente pour stocker mes données.

Je pensais que cela avait peut-être un rapport avec 'capacité_type' => 'post', ou quelque chose de similaire que je suis en train de regarder.

MERCI!

6
danielle

OK, il y a donc quelques arguments de register_post_type que vous devriez utiliser.

Les arguments cruciaux pour vous sont:

  • public - Contrôle la manière dont le type est visible par les auteurs (show_in_nav_menus, show_ui) et les lecteurs (exclude_from_search, publicly_queryable). Si c'est faux, alors exclude_from_search sera vrai, publicly_queryable - faux, show_in_nav_menus - faux et show_ui - faux. Le CPT sera donc caché à fond.

  • exclude_from_search - S'il faut exclure les publications avec ce type de publication des résultats de la recherche frontale. Valeur par défaut: valeur de l'opposé de l'argument public.

  • publicly_queryable - Indique si les requêtes peuvent être exécutées en amont dans le cadre de parse_request (). Valeur par défaut: valeur de l'argument public. Il faut donc que ce soit vrai.

  • show_ui - Indique s'il faut générer une interface utilisateur par défaut pour gérer ce type de message dans l'administrateur. Valeur par défaut: valeur de l'argument public.

  • rewrite - Déclenche le traitement des réécritures pour ce type d'article. Pour empêcher les réécritures, définissez sur false. Valeur par défaut: true et utilise $ post_type comme slug. Il faut donc que ce soit faux.

Ci-dessous vous pouvez trouver le code:

$labels = array( /*removed for example*/ );

$args = array(
    'labels'             => $labels,
    'description'        => __( 'Description.', 'your-plugin-textdomain' ),
    'public'             => false,
    'show_ui'            => true,
    'rewrite'            => false,
    'capability_type'    => 'post',
    'hierarchical'       => false,
    /* ... Any other arguments like menu_icon, and so on */
    'supports'           => array( /* list of supported fields */ )
);

register_post_type( 'customer', $args );

Ce générateur peut être utile si vous ne voulez pas connaître tous les arguments: https://generatewp.com/post-type/

Et la liste de tous les arguments, comme toujours, vous pouvez trouver dans le Codex: https://codex.wordpress.org/Function_Reference/register_post_type

3
Krzysiek Dróżdż

L'un des paramètres pour register_post_type() est publicly_queryable. Définissez-le simplement sur false pour empêcher la création de pages individuelles. Vous pouvez également souhaiter exclure de la recherche, etc.

https://codex.wordpress.org/Function_Reference/register_post_type

Dans l'exemple donné dans le WP Codex, vous pouvez voir que ce paramètre est défini sur true. En fonction de vos besoins, vous pouvez masquer complètement le type de publication avec les paramètres public ou les niveaux de contrôle de visibilité avec les paramètres explicites, tels que pas publicly_queryable.

https://codex.wordpress.org/Function_Reference/register_post_type#Example

Exemple de code provenant de WP Codex

add_action( 'init', 'codex_book_init' );
/**
 * Register a book post type.
 *
 * @link http://codex.wordpress.org/Function_Reference/register_post_type
 */
function codex_book_init() {
    $labels = array( /*removed for example*/ );

    $args = array(
        'labels'             => $labels,
        'description'        => __( 'Description.', 'your-plugin-textdomain' ),
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => array( 'slug' => 'book' ),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => null,
        'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
    );

    register_post_type( 'book', $args );
}

Archive de type de publication Il est important de noter ici que la définition de public_queryable sur false masquera également la page d'archive de ce type de publication. Dans l'exemple de code ci-dessus pour le type de message book, la page d'archivage de https://votredomaine.com/book serait également supprimée.

6
jdm2112

répètera ce que @ jdm2112 a dit dans (j'espère) un anglais plus clair et pas de code du tout;)

Fondamentalement, ce que vous recherchez est un CPT privé. Ce type de CPT est utile pour stocker des données dans la base de données de la même manière que les publications, ce qui vous donne l’avantage d’obtenir (en option) le même type d’interface d’administration et d’utiliser les mêmes API de requête, de méta et de terme.

"Privé" est en réalité un mot trompeur, ce n'est pas que le contenu est privé, mais ce wordpress n'essaiera pas de le publier sur le front-office par lui-même. Vous pouvez, si vous le souhaitez, afficher le contenu sur le front-end, mais vous devrez écrire le code pour cela par vous-même. Dans votre cas spécifique, une façon simpliste de le faire est de créer un modèle de page qui affiche tous les articles de ce CPT. De cette façon, vous avez un contrôle flexible sur l'adresse de la page et sur le référencement que vous voudriez faire.

Gardez simplement à l'esprit qu'il y a de nombreuses fonctionnalités par défaut qu'il vous faudra peut-être réinventer, et il serait peut-être plus simple de simplement rendre public le CPT et d'avoir une sorte d'appel à l'action "voir plus de clients" sur les pages uniques du CPT.

1
Mark Kaplun