J'ai un CPT appelé Service
enregistré comme suit:
$args = array(
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'has_archive' => false,
'rewrite' => array('slug' => 'services', 'with_front' => false),
'query_var' => true,
'capability_type' => 'post',
'hierarchical' => false,
'show_in_nav_menus' => false,
'menu_position' => 20,
'supports' => array(
'title'
'editor',
'thumbnail',
'author',
'revisions'
)
);
register_post_type('service', $args);
J'ai une page appelée "Services" à laquelle est associé un modèle personnalisé qui affiche tous les services avec leurs permaliens de type services/copywriting
(où "copywriting" est le nom du service). Jusqu'ici tout va bien.
J'ai un autre CPT appelé Case Study
. Maintenant, les Case Studies
sont connectés aux articles Services
via le plugin Posts 2 Posts .
J'essaie de faire ce qui suit: utiliser une seule URL Service
post de type /services/copywriting
pour afficher tous les Case Studies
associés à cette Service
.
Pour cela, j'ai ajouté la règle de redirection de modèle comme suit: afin qu'au lieu de single.php
modèle, le modèle archive.php
soit affiché.
add_action("template_redirect", 'template_redirect');
function template_redirect(){
global $wp, $wp_query;
// if Service CPT and it's a single page URL then redirect to archive.php template
if($wp->query_vars["post_type"] == "service" && is_single()){
include(TEMPLATEPATH . '/archive.php');
exit; //thanks to @kaiser's comment
}
}
Dans le modèle archive.php
j'ai:
Case Studies
associés à la Service
actuelle (que je détermine en regardant l'URL services/copywriting
où 'copywriting' est le service actuel).services/copywriting/page/<page_num>
Cependant, ces liens de type services/copywriting/page/<page_num>
ne fonctionnent pas et ils sont toujours redirigés vers le seul lien URL Service
services/copywriting
.
Puis-je ajouter quelque chose pour réécrire des règles ou des filtres ou pour que les liens paginés fonctionnent de cette manière? Donc, services/copywriting/page/2
fonctionnera et serait dirigé vers le modèle archive.php
où mon code SQL personnalisé sera activé et affichera le Case Studies
correct.
Dois-je avoir un modèle dédié plutôt que archive.php
?
J'apprécierais vraiment tous les conseils et l'aide!
Merci beaucoup, Dasha
MODIFIER
J'ai installé le plugin Rewrite Analyzer . Et le test pour services/copywriting/page/2
a correspondu au modèle suivant:
services/([^/]+)/page/?([0-9]{1,})/?$
avec la substitution suivante:
service: copywriting
paged: 2
Je n'ai aucune idée de ce que cela signifie cependant :(
EDIT 2
OK, j'ai essayé d'ajouter une règle de réécriture comme suit dans le functions.php
:
add_action('init', 'my_rewrite_add_rewrites');
function my_rewrite_add_rewrites(){
//rewrite rule for Service single post, make it work as paged
add_rewrite_rule(
'^services/(.+?)/?(page/([0-9]+))?/?$',
'index.php?post_type=service&service=$matches[1]&paged=$matches[3]',
'top'
);
}
J'ai vidé les règles de réécriture. Cependant, lorsque je vais à l'URL de type services/copywriting/page/2
, elle n'affiche que l'URL sans le bit de page services/copywriting/
.
Je ne peux pas comprendre ce qui ne va pas. Est-ce que mon expression rationnelle est fausse ou la construction de index.php
ou les deux?
J'apprécierais vraiment toute aide!
Ok, donc je l’ai fonctionné plus ou moins correctement, bien qu’il reste encore un petit problème , lisez la suite ...
Voici ce que j'ai
dans fucntions.php
:
Réécrire les règles
add_action('init', 'my_rewrite_add_rewrites');
function my_rewrite_add_rewrites(){
add_rewrite_rule(
'^services/([^/]+)/?$',
'index.php?post_type=service&order=ASC&orderby=menu_order',
'top'
);
add_rewrite_rule(
'^services/([^/]+)/page/?([0-9]{1,})/?$',
'index.php?post_type=service&paged=$matches[2]&order=ASC&orderby=menu_order',
'top'
);
}
règle de redirection
add_action("template_redirect", 'my_template_redirect');
function my_template_redirect(){
global $wp_query;
// if Service CPT URL then redirect to archive.php template
if($wp->query_vars["post_type"] == "service"){
include(TEMPLATEPATH . '/archive.php');
exit;
}
}
Alors maintenant, les URL de type 'services/copywriting' et 'services/copywriting/page/2' et ainsi de suite fonctionnent.
Cependant, il reste un petit problème . Par exemple, si j'ai 2 pages de services de rédaction au total, les deux URL suivantes fonctionnent correctement:
Toutefois, l'URL avec une "page non existante" n'est pas redirigé vers le modèle 404
, mais affiche toujours le modèle archive
avec, évidemment, un contenu vide. Alors, comment puis-je m'assurer que ces URL paginées "non existantes" seront redirigées correctement vers le modèle 404
? Par exemple, services/copywriting/page/3
URL lorsqu'il n'y a que des données pour 2 pages.
MODIFIER
Je viens également de remarquer que lorsqu'un service non existant est référencé dans 'services/bla-bla', le modèle archive
est également affiché plutôt que le modèle 404
.
J'apprécierais énormément tous les conseils avant de devenir totalement fou. Merci.
Si j'ai bien compris le problème, vous voulez que votre CPT soit paginé. Après avoir correctement déclaré CPT dans votre functions.php, assurez-vous qu’un modèle single-{posttypename}.php
pertinent a global $page $paged
déclaré dans l’en-tête et qu'il contient une référence à la fonction wp_link_pages ().
Exemple de travail:
<div class="navigation"><?php wp_link_pages(array('before' => '<strong>Pages:</strong> ', 'after' => ' ', 'next_or_number' => 'number')); </div>
Maintenant, ce CPT prend en charge <!--nextpage-->
et vos URL généreront en conséquence.
Aussi cette discussion peut aider . Rappelez-vous - vous ne pouvez pas avoir CPT et Page avec le même nom.