WordPress ignore mes modèles de type de publication personnalisés ?

Publié par Jean-Michel le

WordPress est 404ing tous mes messages de type de publication personnalisé. Ai-je raté une étape ici?

J’utilise ce qui suit pour configurer mon CPT :

function custom_post_types() {
  register_post_type(
    'creativework',
    array(
      'labels' => array(
        'name' => _x('Works', 'post type general name'),
        'singular_name' => _x('Work', 'post type singular name'),
        'add_new' => _x('Add New', 'Work'),
        'add_new_item' => __('Add New Work'),
        'edit_item' => __('Edit Work'),
        'new_item' => __('New Work'),
        'all_items' => __('All Works'),
        'view_item' => __('View Work'),
        'search_items' => __('Search Works'),
        'not_found' =>  __('No Works found'),
        'not_found_in_trash' => __('No Works found in Trash'),
        'parent_item_colon' => '',
        'menu_name' => __('Works')
      ),
      'public' => true,
      'menu_position' => 5,
      //'rewrite' => array('slug' => 'work'),
      'supports' => array('title', 'editor', 'thumbnail'),
      'has_archive' => 'true'
    )
  );
}

add_action( 'init', 'custom_post_types' );

J’avais à l’origine un trait de soulignement dans le type ( creative_work), réécrivant le slug pour qu’il soit simplement « travail », mais je n’avais aucune idée de la permutation que WordPress utiliserait pour trouver le modèle – j’ai essayé des noms de fichiers comme single-creative_work.php, single-creativework.php, single-work.php, tous sous themes/roots/(j’utilisais Roots comme thème de base), avec pour contenu :

<?php get_template_part('templates/content', 'work'); ?>

Mais themes/roots/templates/content-work.phpn’a jamais été affiché. Au lieu de cela, il semblait que themes/roots/page.phpc’était servi? Lorsque j’ai édité manuellement page.phpen get_template_part('templates/content', 'work')tant que test, il a apparemment utilisé le modèle que je voulais, mais il avait ensuite l’ID de publication ou quelque chose d’erroné où il affichait la page d’accueil de TOUT sous website.com/creativework/.

Pour tenter d’éliminer tous les conflits possibles, j’ai désactivé Roots au profit de Twentythirteen, et désactivé tous les plugins sauf un, celui que j’ai écrit pour configurer le CPT (code en haut). Maintenant, chaque fois que je clique sur website.com/creativework/ou website.com/creativework/post-title(en suivant le lien permanent de « Afficher le travail » dans l’éditeur de publication ou dans les résultats de recherche), j’obtiens un 404 au lieu de la page d’accueil, malgré les deux single-creativework.phpet archive-creativework.phpexistant sous themes/twentythirteen.

EDIT: website.com/?creativework=post-title , cependant, fonctionne.

Je suis désespérément confus par tout cela. Quelle est la manière correcte et infaillible de configurer un modèle de type de publication personnalisé, étape par étape ? Idéalement, je veux savoir comment faire cela dans Roots, mais pour l’instant, je vais me contenter de savoir comment le faire fonctionner.

Solution n°1 trouvée

Vous avez une erreur dans les arguments de register_post_type qui peut causer des problèmes dans le frontend. Cette argumentation :

 'has_archive' => 'true'

Devrait être:

 'has_archive' => true

Le nom de fichier correct pour le modèle unique de votre type de publication personnalisé (creative_work) est single-creative_work.phpet doit être dans votre dossier de thème . Par exemple, si votre thème s’appelle « my_theme », le fichier single-creative_work.phpdoit être au format wp-content/themes/my_theme/single-creative_work.php. Vous pouvez également inclure des fichiers modèles à partir de différents emplacements à l’aide de la fonction template_include().

La structure de dossiers dont vous parlez n’est pas celle habituelle dans WordPress ( roots/lib/, roots/templates/, etc.). Ces dossiers proviennent-ils d’un plugin ?

Solution n°2 trouvée

J’ai compris. J’avais essayé d’utiliser flush_rewrite_rules()l’activation/désactivation du plugin, comme suit :

function creativeworks_activate() {
  // register taxonomies/post types here
  flush_rewrite_rules();
}

function creativeworks_deactivate() {
  flush_rewrite_rules();
}

register_activation_hook( __FILE__, 'creativeworks_activate' );
register_deactivation_hook( __FILE__, 'creativeworks_deactivate' );

… mais cela ne semble rien faire. Cependant, lorsque j’ai modifié arbitrairement les options de permalien à l’échelle du site et que je les ai enregistrées, les règles de réécriture ont été vidées avec succès et mes modèles de type de publication personnalisés ont recommencé à fonctionner.

Merci à Milo de m’avoir orienté dans la bonne direction.

Solution n°3 trouvée

J’utilise aussi des racines et j’ai une petite solution de contournement (pas vraiment jolie mais pour moi ça garde les choses organisées). A la racine du répertoire des modèles, il y a un fichier single.php. Vous pouvez y mettre :

if(is_singular('creativework')){
    get_template_part('templates/creativework', 'header');
    get_template_part('templates/creativework', 'main');
}

Ensuite, vous placeriez creativework-header.phpet creativework-main.phpdans le répertoire des modèles. J’utilise cette méthode car j’ai plusieurs types de publication personnalisés et de cette façon je peux utiliser mon propre nom au lieu d’avoir beaucoup de single-cptname.phpfichiers. J’ai en fait supprimé tout le contenu de single.php et y ai mis la fonction ci-dessus (et quelques autres pour chaque type de publication). À côté de cela, je peux inclure plusieurs parties de modèle par type de publication personnalisé (certains en ont jusqu’à 5). Cela permet de mieux organiser mes affaires !

PS, êtes-vous sûr que le nom de votre type de publication personnalisé est creativeworket noncreative-work ?

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *