web-dev-qa-db-fra.com

Custom Post Type Post avec un enfant `Page` Post Post Type Post

Curieusement, je n'arrive pas à trouver quelqu'un qui pose cette question exactement de cette façon.

Est-il possible de faire d'une page un enfant d'un CPT? Répétable (voir ci-dessous pour plus d'informations) n.b. Je ne veux pas dire l'inverse - ce qui est assez facile voir: Un type d'article personnalisé peut-il avoir une page parent?

Exemple:

Est-il possible de réaliser cette structure permalien de manière répétable? C’est-à-dire que je voudrais avoir plusieurs enfants arbitraires page posts de type post sous les messages de type author arbitraires?

N.b. toutes les pages d'auteurs n'auront pas besoin d'un/auteurs/nom-auteur/merci, beaucoup d'entre elles n'ont besoin de rien, d'autres peuvent avoir besoin d'un slug différent, par exemple./auteurs/jane-doe/joyeux anniversaire-voeux

1
setterGetter

Je ne peux pas vraiment penser à une manière de créer un type de page de type post et de le rendre "répétable". Comme Jake l'a dit, cela impliquera des règles de réécriture. Je pense que le moyen le plus simple de le faire serait de configurer des modèles pour tous les cas dans votre répertoire de thème et d'utiliser des vars de requête pour les renseigner. Donc, par exemple:

function wpse_add_query_vars( $vars ){
    $vars[] = "tmpl";
    $vars[] = "author_slug";
    return $vars;
}
add_filter( 'query_vars', 'wpse_add_query_vars' );

function wpse_add_rewrite_rule() {
    add_rewrite_rule( '^authors/([^/]*)/([^/]*)', 'index.php?author_slug=$matches[1]&tmpl=$matches[2]', 'top' );
}
add_action( 'init', 'wpse_add_rewrite_rule' );

function wpse_template_include( $template ) {
    if ( get_query_var( 'tmpl' ) && get_query_var( 'author_slug' ) ) {
        if ( file_exists( get_template_directory() . '/' . get_query_var( 'tmpl' ) . '.php' ) ) {
            $template = get_template_directory() . '/' . get_query_var( 'tmpl' ) . '.php';
        }
    }
    return $template;
}
add_filter( 'template_include', 'wpse_template_include' );

J'ai testé cela et cela fonctionne, mais il faudra probablement le peaufiner pour répondre à vos besoins. En gros, voici ce qui se passe:

  1. Nous enregistrons une variable tmpl afin de pouvoir spécifier un nom de fichier modèle slug. Nous devrons créer les modèles que nous voulons dans notre dossier de thèmes.
  2. Nous allons ajouter une règle de réécriture pour que, si vous appuyez sur /authors/author-name/template-name, nous puissions charger un modèle (s'il existe). Assurez-vous de vider vos permaliens dans les paramètres après avoir ajouté ou modifié des règles de réécriture!
  3. Maintenant, nous accrochons dans template_include pour voir si nous avons le tmpl var défini, vérifions si nous avons un modèle dans notre répertoire de thème et le retournerons si nous l’avons. Ainsi, par exemple, si vous appuyez sur /authors/author-name/thank-you, nous rechercherons un fichier modèle thank-you.php dans le dossier du thème et le chargerons au lieu d’un modèle par défaut. Vous auriez accès à l'auteur slug dans le fichier de modèle en utilisant get_query_var().

Ceci est juste un exemple abstrait et devra évidemment être peaufiné pour vos besoins, mais en utilisant cette méthode vous seriez capable de créer autant de pages que vous en avez besoin et de les maintenir directement à partir du thème. Je n’ai pas non plus créé d’auteur CPT pour le tester à fond. Vous devrez donc peut-être ajuster la règle de réécriture afin qu’elle n’entre pas en conflit avec ce que vous essayez de faire avec l’auteur CPT (en fait, vous n’aurez peut-être même pas besoin de le faire.) utilisez la requête author_slug comme elle est probablement déjà disponible chez WP).

Voici quelques ressources supplémentaires:

  1. Page de modèle de page personnalisée basée sur la réécriture d'URL
  2. L'API de réécriture: Post Types & Taxonomies

Bien sûr, il y a plus d'une façon de peauner un chat, mais espérons que cela vous aidera à vous orienter dans la bonne direction ou au moins à vous donner une idée de ce qui est possible.

3
brianjohnhanna

Je ne peux pas vraiment penser à un moyen facile et répétable de faire cela, mais consultez: https://wordpress.org/support/topic/create-static-subpage-for-a-custom-post-type

Vous pouvez créer un paramètre personnalisé à la fin de votre type de publication. Une fois que vous obtenez cela, vous pouvez charger un modèle et utiliser ce paramètre pour interroger le contenu de la page.

1
Jake Deichmann