web-dev-qa-db-fra.com

Publier une règle de réécriture pour pointer vers une page/un modèle personnalisé

J'ai un type de message personnalisé/taxonomie qui fonctionne bien pour le moment.

J'ai écrit des règles de réécriture personnalisées pour créer des URL telles que:
domain.tld/postTypeName/parentTaxonomy/childTaxonomy/postSlug

function custom_rewrite_rules($rules) 
{
    $newrules = array();
    $newrules['lessons/(.+)/(.+)/(.+)/?$'] = 'index.php?lessons=$matches[3]';
    $newrules['lessons/(.+)/?$'] = 'index.php?level=$matches[1]';
    //$newrules['lessons/?$'] = 'index.php?post_type=lessons';

    return array_merge($newrules, $rules);
}
add_filter('rewrite_rules_array', 'custom_rewrite_rules');

Ce que je cherche à faire, c'est de créer une nouvelle règle pour créer une URL comme:
domain.tld/postTypeName/parentTaxonomy/home

"home" il ne fait pas partie du type d'article personnalisé ni de la taxonomie et je souhaite utiliser une page déjà créée (lessonhome) avec un modèle personnalisé pour cette URL.

Ajout d'un var de requête:

function prefix_register_query_var($vars) 
{
  $vars[] = 'home';

  return $vars;
}
add_filter('query_vars', 'prefix_register_query_var');

Ajout d'un filtre de redirection et de template:

function prefix_url_rewrite_templates() 
{
  if (get_query_var('home') && is_singular('lessons')) 
  {
    add_filter('template_include', function() 
    {
      return get_template_directory() . '/custom-page-template.php';
    });
  }
}
add_action('template_redirect', 'prefix_url_rewrite_templates');

Ajout d'une nouvelle règle de réécriture:

$newrules['lessons/(.+)/home/?$'] = 'index.php?post_type=page&name=lessonhome&home=yes';

Et la méthode custom_rewrite_rules a été modifiée en:

function custom_rewrite_rules($rules) 
{
    $newrules = array();
    $newrules['lessons/(.+)/(.+)/(.+)/?$'] = 'index.php?lessons=$matches[3]';
    $newrules['lessons/(.+)/home/?$'] = 'index.php?post_type=page&name=lessonhome&home=yes';
    $newrules['lessons/(.+)/?$'] = 'index.php?level=$matches[1]';
    //$newrules['lessons/?$'] = 'index.php?post_type=lessons';

    return array_merge($newrules, $rules);
}
add_filter('rewrite_rules_array', 'custom_rewrite_rules');

Mais ça ne marche pas - ça me redirige vers cette page: domain.tld/lessonhome
Qu'est-ce que je fais mal/manque ici?

1
Philip

Je ne sais vraiment pas pourquoi il fait cette redirection, mais j'ai résolu ce problème en changeant le post_type&name

$newrules['lessons/(.+)/home/?$'] = 'index.php?post_type=page&name=lessonhome&home=yes';

à page_id:

$newrules['lessons/(.+)/home/?$'] = 'index.php?page_id=24&home=yes';

ou à pagename:

$newrules['lessons/(.+)/home/?$'] = 'index.php?pagename=lessonhome&home=yes';

et ça marche bien!

0
Philip