web-dev-qa-db-ja.com

WordPressは私のカスタムルートは404だと思います

カスタムルートを設定し、そのURLのテンプレートファイルを読み込むプラグインを作成しました。 WordPressがテンプレートを正しくレンダリングしているにも関わらず404だと思われることを除けば、すべてうまくいきます。

たとえば、ドキュメントのタイトルに404と表示され、error404クラスが<body>に追加されます。

カスタムURLはdomain.com/path/:idです。ここで:idは投稿IDに対応する動的な値なので、URLはdomain.com/path/275になります。以下の例では、some_idがpost id変数として使用されています。

これが私のプラグインの縮小版です。

<?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();

私はここに何かが足りないのですか?それとも他の場所でこのバグを探し始めるべきですか?

4
Ahrengot

手動でis_404 = false;を設定すると私の問題は解決しました。しかし、これが最善の方法であるかどうかはわかりません。私は幸運なことに代わりにpre_get_postsフィルタを代わりに使ってみました。

とにかく、同じ船に乗っている他の誰のためにも、あなたは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;
}

そして、ドキュメントのタイトル(<title>セクションの<head>内のもの)を更新するために、これをうまく動作させるためのスニペットがあります。

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 );

誰かがより良い方法を知っているなら私に知らせてください。

1
Ahrengot