web-dev-qa-db-ja.com

複数のURLから同じページにアクセスする(ワイルドカード)

特定のWordpressページを複数のURLに配信したいです。基本的に、私は特定のフォーマットのすべてのURLを既知のページを指すようにします。

/some-prefix-* => /target-page

そして/some-prefix-and-here-somethingにアクセスすると/target-pageがロードされるはずです。

これを行う方法?

注意私はnotはユーザーをリダイレクトしたいが複数のURLに既存のページを提供できるようにしたいのです。

.htaccessは次のようになります。

# BEGIN s2Member GZIP exclusions
RewriteEngine On RewriteRule ^prefix-*$ some/path/to/directory-$1 [NC,L]
<IfModule rewrite_module>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{QUERY_STRING} (^|\?|&)s2member_file_download\=.+ [OR]
    RewriteCond %{QUERY_STRING} (^|\?|&)no-gzip\=1
    RewriteRule .* - [E=no-gzip:1]
</IfModule>
# END s2Member GZIP exclusions

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

DirectoryIndex index.php index.html

私はRewriteEngine On RewriteRule ^prefix-*$ some/path/to/directory-$1 [NC,L]を追加することによって/prefix-*からsome/path/to/directory-$1を提供すると思いました。例えば:example.com/prefix-fooにアクセスするときはexample.com/some/path/to/directory-fooと同じであるべきです(これはexample.com/some/path/to/directory-foo/index.htmlに解決されます)。

また、prefix-barという名前のWordpressページが既に存在する場合、/prefix-barexample.com/some/path/to/directory-bar/index.htmlnotロードする必要があります。

6
Ionică Bizău

template_include を使用できますが、このフィルタにフックする前に、次の手順を実行する必要があります。

  1. ページテンプレートを作成します。例:page-target.php

    <?php
    /**
     * Template Name: Page Target
     */
    ...
    
  2. グローバルなtarget-pagepage-target.phpページを参照するため、$postテンプレートのsome-prefix-*の内容を手動で照会します。

  3. (オプション):ページ属性からページテンプレートPage Targetを編集して/target-pageに適用します。

それからあなたのfunctions.phpファイルに以下を追加してください

add_filter('template_include', function($template) {
    global $post;

    $prefix = 'some-prefix-'; // Your prefix
    $prefixExist = strpos($post->post_name, $prefix) !== false;

    if ($prefixExist) {
        return locate_template('page-target.php'); //Your template
    }

    return $template;
});

上記のフィルタは、条件が満たされていればpage-target.phpでテンプレートを上書きし、そうでなければデフォルトになります。

編集する

add_rewrite_rule を使ってこれを解決するもっと良い方法を見つけたと思います

function custom_rewrite_basic() {
  $page_id = 123; //Your serve page id
  add_rewrite_rule('^some-prefix-.*', 'index.php?page_id=' . $page_id, 'top');
}
add_action('init', 'custom_rewrite_basic');

重要: ルールを変更した後は、書き換えルールデータベースをフラッシュして再生成することを忘れないでください。 WordPress管理画面から、設定 - >パーマリンクを選択し、変更を加えずに変更を保存をクリックします。

9
Rahil Wazir

that 検索エンジンは、同じコンテンツへの複数のパスを好まない場合があります。

ここで私はあなたが欲しいと思います例えば:

example.tld/some/path/to/painting-orange
example.tld/painting-blue
example.tld/painting-red
example.tld/painting-yellow

このページのように振る舞うために:

example.tld/paintings

しかし以下のようなパスではそうではありません。

example.tld/painting-white/painting-brown/large
example.tld/painting-brown/small

ここでの規則は、basename( $path )の左側の接頭部と一致することです。

現在のページ名のプレフィックスが正しいかどうかを確認するために、requestフィルタを使用して少しハックします。

<?php
/** 
 * Plugin Name: Wildcard Pages
 */
add_filter( 'request', function( $qv )
{
    // Edit to your needs
    $prefix = 'painting-';
    $target = 'paintings';

    // Check if the current page name is prefixed
    if(    isset( $qv['pagename'] )
        && $prefix === substr( basename( $qv['pagename'] ), 0, strlen( $prefix ) ) 
    )
        $qv['pagename'] = $target;

    return $qv;
} );

必要に応じてこれを修正してください。それから、プラグインファイル/wp-content/plugins/wpse-wildcard-pages/wpse-wildcard-pages.phpファイルを作成して、バックエンドからプラグインをアクティブにします。

ターゲットページに get_page_by_path() のチェックを追加して、それが存在することを確認することもできます。これを特定の投稿タイプに制限することもできます。

4
birgire

現在の投稿のスラッグがあなたの接頭辞で始まったらinitとwp_redirectへのフックを作成します。

function wp_init() {

    global $post;
    $slug = $post->post_name;
    $prefix = 'foobar';
    if (substr($slug, 0 strlen($prefix))==$prefix) {
        wp_redirect(123); // your page id
    }

}
add_action('init', 'wp_init');
0
Fleuv