web-dev-qa-db-fra.com

Utilisation de /% postname% pour un type de publication personnalisée

J'ai un type de message personnalisé dont le permalien doit être placé dans le même espace que les pages, comme ceci:

/an-example-thing  <--  custom post type 'thing'
/about-the-things  <--  a normal page

Je suis bien conscient que ce n'est pas la méthode recommandée , mais je n'ai pas vraiment le choix - c'est ce que le client a spécifié.

J'ai créé les types personnalisés avec register_post_type et utilisé le plug-in Custom Post Permalinks pour définir leur lien permanent de la manière suivante:

/%thing%/

Toutefois, cela crée un conflit entre la règle qui reconnaît mes publications personnalisées et celle des pages normales - qui convertit toutes les pages normales en 404. Ce problème disparaît lorsque le permalien est changé en quelque chose comme ceci:

/things/%thing%/

L'utilisation de Monkeyman Rewrite Analyzer montre que la règle de la publication personnalisée commence à venir. Même quand j'essaie de le forcer à utiliser des règles verbeuses:

global $wp_rewrite;
$wp_rewrite->use_verbose_page_rules = true;

la règle de type de publication personnalisée a une priorité plus élevée que les règles détaillées pour les pages, de sorte qu'elles obtiennent toujours un 404.

Je voudrais qu'il cherche d'abord choses, et lorsqu'il n'y en a pas qui porte ce nom, cherche des pages. L'inverse serait acceptable. N'y a-t-il aucun moyen de le persuader de chercher à la fois choses et les pages avant de frapper un 404?

5
Marcus Downing

Vous commencez avec un point bonus pour utiliser mon analyseur de réécriture :-)

En effet, même si vous utilisez des règles de page verbeuses, depuis la version 3.1 (ou quelque chose autour de cela), les règles de réécriture de la taxonomie sont antérieures. J'ai récemment répondu à une autre question avec un moyen de les déplacer vraiment vers le haut. Cela devrait fonctionner si les règles de page verbeuses ne vous dérangent pas (si vous n'avez pas plus de 25 pages ou plus).

Si vous ne voulez pas de règles de page détaillées, vous devrez étendre la classe de base WP afin qu'elle puisse traiter les situations "ambiguës" dans lesquelles l'URL peut faire référence à une page ou à un type de publication personnalisé. Mike une fois fourni un bon moyen de le faire . Sa réponse est écrite pour une taxonomie personnalisée, mais elle devrait également être adaptable à un type de publication personnalisé.

2
Jan Fabry

J'ai trouvé une solution, mais c'est vraiment moche: accrocher le routage 404 pour livrer la page qui devrait être livrée. Le code est un peu compliqué car je dois également gérer un préfixe multisite.

theme/404.php

<?php
global $current_blog;
$prefix = $current_blog->path;
$path = $_SERVER['REQUEST_URI'];
$path = preg_replace("!^$prefix!i", "", $path);
$path = preg_replace("!\?.*$!i", "", $path);
$path = trim($path, '/');
$page = get_page_by_path($path);

if (isset($page)) {
  $template = get_post_meta($page->ID, '_wp_page_template', true);
  if (empty($template))
    $template = get_page_template();
  query_posts("post_type=page&id={$page->ID}");
  include($template);
  die;
}
?>
...actually handle a 404...

Après avoir identifié une page, il doit exécuter à nouveau query_posts pour charger correctement toutes les données. C'est loin d'être la solution idéale, mais cela a au moins fonctionné pour moi. Je serais heureux de le remplacer par une meilleure solution si quelqu'un peut en suggérer une.

0
Marcus Downing

Il existe deux plugins qui résolvent ce problème.

Celui-ci supprime le slug de type en ajoutant une règle spécifique pour chaque page de type de publication personnalisée.

Celui-ci semble plus avancé, il vous permet de configurer n'importe quelle structure de slug, mais il est également abandonné par le développeur.

Je les ai fait fonctionner tous les deux, bien qu'au départ, je devais déboguer avec Monkeyman Rewrite Analyzer parce que d'autres règles interféraient.

0
Adam Bell