特定の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-bar
はexample.com/some/path/to/directory-bar/index.html
をnotロードする必要があります。
template_include
を使用できますが、このフィルタにフックする前に、次の手順を実行する必要があります。
ページテンプレートを作成します。例:page-target.php
<?php
/**
* Template Name: Page Target
*/
...
グローバルなtarget-page
はpage-target.php
ページを参照するため、$post
テンプレートのsome-prefix-*
の内容を手動で照会します。
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管理画面から、設定 - >パーマリンクを選択し、変更を加えずに変更を保存をクリックします。
注 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()
のチェックを追加して、それが存在することを確認することもできます。これを特定の投稿タイプに制限することもできます。
現在の投稿のスラッグがあなたの接頭辞で始まったら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');