将主页重定向到分类存档的最佳方式?

时间:2013-11-05 作者:its_me

问题

在不涉及外部因素(例如Apache的htaccess)的情况下,将WordPress网站的主页重定向到类别归档的最佳方式是什么?

为什么

(只是为了证明问题的正确性。请不要让问题变得过于本地化)

这是一个新闻网站。这些类别用作版本,例如:

美国:http://example.com/main/http://example.com/uk/http://example.com/jp/(基于类别的已删除。)

访客将被带到美国版(http://example.com/main/) 默认情况下,无论他/她来自哪里,这就是我希望重定向的原因。

考虑的选项我知道我可以简单地修改主查询,并且主页只包含特定类别(版本)的帖子。但从网站特征的构建方式来看,我发现重定向更可行,而且更合适。

除此之外,我希望URL能够让访问者清楚地看到当前位置。

至于为什么我不能使用更简单和更好的性能。基于htaccess的重定向——所有功能都需要在主题内或作为单独的插件。因此,我们正在寻找使用WordPress/PHP的最佳方法。

我也考虑过adding this in home.php 模板文件:

<?php
    wp_redirect( \'http://example.com/main/\' );
?>
并决定反对它,因为它”almost doubles server load for home page“。

2 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

除去所有其他解决方案,至少还有一个解决方案: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 只会加载一个模板,而不是在加载模板后进行第二次重定向。

根据@Milo的评论编辑,您还可以尝试更早地加入该过程,在pre_get_posts, 从而可能保存整个查询请求:

add_action( \'pre_get_posts\', \'wpse121308_redirect_homepage\' );

SO网友:gmazzap

我写了2条评论,但是现在我有更多的时间,想添加一个对某人有用的答案。

问题是:一旦我们想要重定向被WordPress触发,我们must 加载WordPress 2次:第一次执行重定向,第二次显示所需的主页。

所以我的想法是,在重定向之前加载得越少,整个过程就会越快,服务器负载也会越小。

WordPress加载的第一个非核心项目是MU插件。所以我认为我们想要做的最好的地方是一个Mu插件。

我们必须面对的问题是MU plugins 加载时,我们不知道查询,并且alo条件标记不起作用。然而,在这种特定的情况下,当我们在主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 plugins文件夹中。

默认情况下,此文件夹称为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();
}

结束