web-dev-qa-db-ja.com

動的エンドポイント

WordPressの外部にエンドポイントを作成する必要があるデータベーステーブルがあります。リンクを生成するためにページテンプレートを使用することを計画しているページ/cars/を作成しました。 URLが/cars/camaro//cars/%model%/)のようになるようにします。もともと私はエンドポイントでそれができると思っていましたが、モデルテーブルから引き出されたスラッグを基にしてそれらを動的にする方法がわからなかった。私はまた、それがパーマリンク構造タグを使うほうが簡単であるかどうか、あるいはどちらが良いかどうか確信が持てませんでした。

どこから始めればいいのか完全にはわかりません。以前は「静的な」エンドポイントを作成していたので、そこから飛び出すためのベースがありましたが、requestフィルタに到達するとどうすればよいのかわかりません。

/**
 * Add endpoint to handle models
 */
function theme_endpoints() {
    add_rewrite_endpoint( 'cars', 'EP_PAGES' );     // Since cars is our base
}
add_action( 'init', 'theme_endpoints' );

/**
 * Filter request variables
 * @param array $vars
 * @return array $vars
 */
function theme_perma_requests( $vars ) {

    if( isset( $vars['model'] ) ) {
        $vars['model_template'] = true;
    }

    return $vars;
}
add_filter( 'request', 'theme_perma_requests' );

つまり、これで私のtemplate_includeにアクセスできます(これがmodel_template変数を追加した理由です)が、実際にはURLを書き換えることはありません。それで私はadd_rewrite_rule()で遊び始めました

/**
 * Theme rewrite rules
 */
function theme_rewrite_rules() {
    add_rewrite_rule( '^cars/([^/]*)/?$', 'index.php?page_id=8&model=$matches[0]', 'top' );
}
add_action( 'init', 'theme_rewrite_rules' );

私は私のパーマリンクをフラッシュしましたが、書き換えは効力を発揮しないようです、私は規則が書かれている方法で何かがおかしいと思うことしかできません。


both /エンドポイントと書き換えルール、あるいはそのうちの1つだけが必要ですか。私はそれについてすべて間違っているのだろうか?どうやって/cars/camaro/のパーマリンク構造を達成することができますか?

7
Howdy_McGee

その達成方法の優れた例として、10upエンジニアリングのベストプラクティス。基本的には、新しいリライトタグと新しいリライトルールを追加してから、template_redirectアクションを使用してカスタムアクションを返します。

これがコードです:

add_action( 'init', function() {
  add_rewrite_tag( '%model%', '([^/]+)' );
  add_rewrite_rule( 'cars/([^/]+)/?', 'index.php?model=$matches[1]', 'top' );
} );

add_action( 'template_redirect', function() {
  global $wp_query;

  $model = $wp_query->get( 'model' );

  if ( ! empty( $model ) ) {
    // Return stuff here
  }
} );

新しいエンドポイントを試す前に、パーマリンクをフラッシュすることを忘れないでください。 wp-cliを使う:

wp rewrite flush

または管理UIを使用して: http://example.local/wp-admin/options-permalink.php そして保存をクリックします。

5
jonathanbardo