web-dev-qa-db-fra.com

WordPress Ignorer mes modèles de type de message personnalisé?

WordPress traite tous mes messages de type de message personnalisé. Ai-je manqué une étape ici?

J'utilise les éléments suivants 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' );

À l'origine, j'avais un trait de soulignement dans le type (creative_work), réécrivant le slug pour qu'il ne soit que "travail", mais je ne savais pas quelle permutation utiliserait WordPress pour trouver le modèle. J'ai essayé des noms de fichiers tels que single-creative_work.php, single-creativework.php, single-work.php, themes/roots/ (J'utilisais les racines comme thème de base), avec le contenu:

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

Mais themes/roots/templates/content-work.php n'a jamais été affiché. Au lieu de cela, il semblait que themes/roots/page.php était en train d’être servi? Lorsque j'ai modifié manuellement page.php en get_template_part('templates/content', 'work') en tant que test, il a apparemment utilisé le modèle que je voulais, mais il contenait l'identifiant de publication ou quelque chose de mal où la page d'accueil de ANYTHING était affichée sous website.com/creativework/.

Pour tenter d'éliminer tous les conflits possibles, j'ai désactivé Roots en faveur 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 la recherche), je reçois un 404 au lieu de la page d'accueil, malgré que single-creativework.php et archive-creativework.php existent déjà sous themes/twentythirteen.

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

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

1
Hugh Guiney

Je l'ai. J'avais essayé d'utiliser flush_rewrite_rules() lors de l'activation/désactivation d'un 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 semblait 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é ont recommencé à fonctionner.

Thonks à Milo pour m'avoir orienté dans la bonne direction.

2
Hugh Guiney

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

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

Ensuite, vous placeriez creativework-header.php et creativework-main.php dans le répertoire des modèles. J'utilise cette méthode parce que j'ai plusieurs types de publication personnalisés, ce qui me permet d'utiliser mon propre nom au lieu d'avoir beaucoup de fichiers single-cptname.php. En fait, j'ai supprimé tout le contenu de single.php et y ai placé la fonction ci-dessus (et d'autres encore pour chaque type de message). En plus de cela, je peux inclure plusieurs parties de modèle par type de publication personnalisé (certaines en ont jusqu'à 5). Cela permet de mieux organiser mes affaires!

PS, êtes-vous sûr que le nom de votre type de message personnalisé est creativework et non creative-work?

0
eskimo

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

 'has_archive' => 'true'

Devrait être:

 'has_archive' => true

Le nom de fichier correct pour le modèle unique de votre type de publication personnalisée (creative_work) est single-creative_work.php et doit figurer dans votre dossier de thème . Par exemple, si votre thème s'appelle "my_theme", le fichier single-creative_work.php doit se trouver dans wp-content/themes/my_theme/single-creative_work.php. Vous pouvez également inclure des modèles de fichiers de différents emplacements à l’aide de la fonction template_include () .

La structure de dossiers dont vous parlez n’est pas l’habitude dans Wordpress (roots/lib/, roots/templates/, etc.). Est-ce que ces dossiers proviennent d'un plugin?

0
cybmeta