web-dev-qa-db-fra.com

WordPress pense que mon itinéraire personnalisé est un 404

J'ai créé un plugin qui configure une route personnalisée, puis charge un fichier de modèle pour cette URL. Tout fonctionne bien, sauf que WordPress semble penser qu'il s'agit d'un 404 même s'il rend correctement mon modèle.

Par exemple, il est indiqué 404 dans le titre du document et une classe error404 est ajoutée à <body>

L'URL personnalisée est domain.com/path/:id, où :id est une valeur dynamique correspondant à un identifiant de publication. L'URL peut donc être domain.com/path/275. Dans l'exemple ci-dessous, some_id est utilisé comme variable post-id.

Voici une version réduite de mon plugin:

<?php

class MyPlugin {
  public function __construct() {
    add_action( 'init', array($this, 'add_response_endpoint') );
    add_filter( 'template_include', array($this, 'add_response_template') );
  }

  public function add_response_endpoint() {
    add_rewrite_rule(
      '^path/([0-9]+)/?',
      'index.php?pagename=my_custom_url&some_id=$matches[1]',
      'top'
    );

    add_rewrite_tag('%some_id%', '([^&]+)');
  }

  public function add_response_template($template) {
    if ( get_query_var( 'pagename' ) === 'my_custom_url' ) {
      $template = trailingslashit( dirname( __FILE__ ) ) . 'templates/custom-page-template.php';
    }

    return $template;
  }
}

new MyPlugin();

Est-ce que j'ai râté quelque chose? Ou devrais-je commencer à chercher ce bogue ailleurs?

4
Ahrengot

La définition manuelle de is_404 = false; a corrigé mon problème. Cependant, je ne suis pas sûr que ce soit la meilleure façon de le faire. J'ai essayé d'utiliser le filtre pre_get_posts à la place sans aucune chance.

Quoi qu'il en soit, pour quiconque dans le même bateau, vous pouvez le faire pour vous débarrasser de l'état 404:

public function add_response_template($template) {
  global $wp_query;
  if ( 'my_custom_url' === get_query_var( 'pagename' ) ) {
    $wp_query->is_404 = false;
    $template = trailingslashit( dirname( __FILE__ ) ) . 'templates/custom-page-template.php';
  }

  return $template;
}

Et pour mettre à jour le titre du document (ce qui se trouve à l'intérieur de <title> dans la section <head>), voici un extrait pour que cela fonctionne correctement.

add_filter( 'document_title_parts', function($title_arr) {
  if ( 'my_custom_url' === get_query_var('pagename') ) {
    $title_arr['title'] = "Document title for my custom route";
  }

  return $title_arr;
}, 10, 1 );

Si quelqu'un connaît un meilleur moyen, faites-le-moi savoir.

1
Ahrengot