外部要因(例:Apacheの.htaccess)を含まずに、つまりWordPress内で、WordPressサイトのホームページをカテゴリアーカイブにリダイレクトするための最適な方法は何でしょうか。
(質問を正当化するためだけに。質問をにローカライズしすぎにしないでください。)
ニュースサイトです。カテゴリは、エディションとして使用されます。次に例を示します。
http://example.com/main/
http://example.com/uk/
http://example.com/jp/
(カテゴリベースは削除されました。)
訪問者は、出身地に関係なく、デフォルトでUS版(http://example.com/main/
)に移動されます。そのため、リダイレクトを希望します。
メインのクエリを変更して、ホームページに特定のカテゴリ(エディション)の投稿のみを含めることができます。しかし、サイトの機能がどのように構成されているかによって、私はリダイレクトがより実行可能であり、そしてさらに適切であると思います。
それとは別に、私はURLが訪問者に現在の場所を明確にすることを望みます。
なぜ私はよりシンプルで優れたパフォーマンスの.htaccessベースのリダイレクトを使うことができないのか - すべての機能はテーマの中にあるか、別のプラグインとしてある必要があります。したがって、WordPress/PHPでそれを実行するための最良の方法を探してください。
私は これをhome.php
templateファイルに追加することも考えました。
<?php
wp_redirect( 'http://example.com/main/' );
?>
他のすべての解決策を排除して、少なくとも1つの残りがあります: template_redirect
:
function wpse121308_redirect_homepage() {
// Check for blog posts index
// NOT site front page,
// which would be is_front_page()
if ( is_home() ) {
wp_redirect( get_category_link( $id ) );
exit();
}
}
add_action( 'template_redirect', 'wpse121308_redirect_homepage' );
もちろん、適切なカテゴリ$id
を渡す必要があります。
template_redirect
にリダイレクトすることの利点は、2回目のリダイレクトテンプレートのロード後)ではなく、1回のテンプレートロードのみが行われることです。
@ Miloのコメントによれば、pre_get_posts
でもっと早くプロセスにフックすることを試みることもでき、それによってクエリリクエスト全体を潜在的に節約することができます:
add_action( 'pre_get_posts', 'wpse121308_redirect_homepage' );
2つのコメントを書きましたが、今はもっと時間があるので、誰かに役立つことができる答えを追加したいと思います。
問題はこれです。リダイレクトがWordPressによって引き起こされたら、WordPressを2回ロードしなければなりません2回目:リダイレクトを実行し、2回目は目的のホームページを表示します。
だから私はリダイレクトの前に私がより少ない負荷、より速く全体のプロセス、そしてより少ないサーバーの負荷になると思った。
WordPressによってロードされる最初のコアアイテムはMUプラグインです。だから私たちがやりたいことをするのに最適な場所はMuプラグインだと思います。
私たちが直面しなければならない問題は、 MUプラグイン がロードされたとき、クエリがわからず、条件付きタグも動作しないことです。ただし、この特定のケースでは、自宅のURLにいるときにリダイレクトしたいので、URLを見ていると認識しやすいです。
第二の小さな問題は、ホームページをリダイレクトするリンクを知る方法です。私たちはプラグインコードでそれをハードコーディングすることができますが、優雅な解決策ではありません。私たちはget_category_link
を実行することができますが、私たちが迫害しているパフォーマンスが理想的でないならば、私は良い妥協がwp-config.php
でそれをハードコーディングすることができると思う。
wp-config.php
を開いて追加
define( 'WP_SITEURL', 'http://www.example.com' );
define('THEHOMEPAGEREDIRECT', WP_SITEURL . '/main');
それからファイルを作成し、thehomepageredirector.php
という名前を付けてMUプラグインフォルダに保存します。
デフォルトでは、このフォルダはmu-plugins
と呼ばれ、wp-content
フォルダの中(plugins
フォルダの横)にあります。 MUプラグインを有効にする必要はありません。
このファイルでは、あなただけを置くべきです:
if ( ! defined('THEHOMEPAGEREDIRECT') ) return;
$home_path = trim( \parse_url( home_url(), PHP_URL_PATH ), '/' );
$url = str_replace( $home_path, '', add_query_arg( array() ) );
if ( $url === '/' ) {
// pluggable is loaded after MU plugins
require( ABSPATH . WPINC . '/pluggable.php' );
wp_safe_redirect(THEHOMEPAGEREDIRECT, 301);
exit();
}
このように、あなたがhttp://www.example.com
にアクセスした時、リダイレクトは起こります。そして、それは、あらゆるプラグインとテーマがロードされる前、クエリが起動する前、たくさんのフックがトリガーされる前に...たくさんの前に起こります。
無効なクエリ文字列または空のクエリ文字列がURLに含まれているときにリダイレクトをトリガーしないことも可能です。
/**
* Class used only to retrieve all the valid query vars
*/
class WP_Extend extends WP {
public $all_vars;
function __construct() {
$this->all_vars = array_merge($this->public_query_vars, $this->private_query_vars);
}
}
if ( ! defined('THEHOMEPAGEREDIRECT') ) return;
$home_path = trim( \parse_url( home_url(), PHP_URL_PATH ), '/' );
$url = str_replace( $home_path, '', add_query_arg( array() ) );
$url_array = \explode( '?', $url );
if ( count($url_array) > 1 ) {
$qs = array();
parse_str( $url_array[1], $qs );
$good = array_filter($qs);
// do not redirect if empty query string are in the url
if ( empty ( $good ) ) return;
$wpe = new WP_Extend;
$valid = array_intersect( array_keys($good), $wpe->all_vars );
// do not redirect if not valid query string are in the url
if ( count( $good ) != count($valid) ) return;
}
if ( $url === '/' ) {
// pluggable is loaded after MU plugins
require( ABSPATH . WPINC . '/pluggable.php' );
wp_safe_redirect(THEHOMEPAGEREDIRECT, 301);
exit();
}