web-dev-qa-db-fra.com

Personnalisation des règles de réécriture pour que l'URL à publication unique CPT fonctionne comme une URL paginée

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:

  • un SQL personnalisé qui obtient tous les Case Studies associés à la Service actuelle (que je détermine en regardant l'URL services/copywriting où 'copywriting' est le service actuel).
  • une fonction qui crée des liens pour la pagination de type 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 Serviceservices/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!

2
dashaluna

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:

  • services/rédaction /
  • services/rédaction/page/2

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.

1
dashaluna

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' => '&nbsp;', '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.

0
ommunist