web-dev-qa-db-ja.com

ホームページをカテゴリーアーカイブにリダイレクトをする最適な方法は?

質問

外部要因(例: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/' );
?>

はホームページのサーバー負荷をほぼ2倍にします 」。

1
its_me

他のすべての解決策を排除して、少なくとも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' );
3
Chip Bennett

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();
}
1
gmazzap