将博客档案重定向为特定格式

时间:2014-03-23 作者:Mayeenul Islam

我的博客存档URL如下:

http://example.com/2014/03
我将网站的永久链接从/%postname%//%postid%/%postname%/, 使用重定向插件,我设置了如下重定向:redirection 1

它正在发挥作用。但问题发生在存档URL中。在日期之前使用/date/basename生成的新存档URL,如:

http://example.com/date/2014/03
我正在尝试使用相同的重定向插件重定向URL,但失败:redirection 2

然后我试着写作.htaccess 我自己(没有.htaccess 写作经验):

Redirect permanent http://example.com/([0-9]+)/([0-9]+) http://example.com/date/([0-9]+)/([0-9]+)
借助于htaccess editorthis blog. 但也失败了。

我怎样才能让我的博客不在这样的存档URL上获取404?恐怕,我到现在为止对重写规则都不懂(

1 个回复
SO网友:gmazzap

我正在开发一个插件来处理这样的事情。在开发过程中,我想分享一些源于插件的代码,希望能对您有所帮助。

如果查看源URL,很容易识别它们:有两种情况需要重定向:

url包含两个片段,两个片段都是数字,第一个是4位数,第二个是1到12位数。url包含一个片段,这是一个有效的后段标记。查看片段数非常简单,只需count() 和aexplode(), 需要在数据库中查询有效的post slug。

工作流获取url,分解url片段并对其进行计数:如果计数不是1或2,则不执行任何操作,检查url片段并在需要时应用重定向:
  • 如果计数是1,则检查其是否为有效的后期段塞,如果是,则重定向如果计数是2,则检查片段是否如下/%year%/%monthnum% 如果是这样,则重定向#3可以使用基于瞬态的缓存提高性能。

    1。获取url让我们编写一个函数来获取url片段。它必须剥离home_url() 来自URL的部分。

    function get_url_pieces() {
      $home_path = trim( parse_url( home_url(), PHP_URL_PATH ), \'/\' );
      $full = trim( str_replace( $home_path, \'\', add_query_arg( array() ) ), \'/\' );
      $sane_array = explode( \'?\', $full );
      // removing any query string
      $qs = array();
      if ( isset( $sane_array[ 1 ] ) ) parse_str( $sane_array[ 1 ], $qs );
      $stripped = trim( $sane_array[ 0 ], \'/\\\\\' );
      $pieces = ! empty( $stripped ) ? array_filter( explode( \'/\', $stripped ) ) : array();
      return $pieces;
    }
    

    2。分解url片段并对其进行计数:如果计数不是1或2,则什么都不做

    这部分工作流应尽可能简单地运行,\'after_setup_theme\' 是一个很好的地方,因为插件和url都可以使用,而且时间还早。

    add_action( \'after_setup_theme\', function() {
      if ( is_admin() ) return;
      $url_pieces = get_url_pieces();
      if ( is_array($url_pieces) ) {
        if ( count( $url_pieces ) === 1 ) {
          my_post_redirect( $url_pieces );
        } elseif ( in_array( count($url_pieces), array(2, 3), TRUE ) ) {
          my_date_redirect( $url_pieces );
        }
      }
    } );
    

    3。检查url片段并在需要时应用重定向

    function my_date_redirect( Array $pieces ) {
      $cached = redirect_if_cached( $pieces );
      // if we are here url is not cached, see redirect_if_cached() below
      // let\'s check date format
      if ( ! in_array( count($pieces), array( 2, 3), TRUE ) ) return;
      if ( ! strlen("{$pieces[0]}") === 4 ) return;
      $day = ! isset( $pieces[2] ) ? \'01\' : $pieces[2];
      if ( ! checkdate ( (int)$pieces[1], (int) $day, (int) $pieces[0] ) ) return;
      // that\'s a valid date
      // cache and redirect
      $redirect = "date/{$pieces[0]}/{$pieces[1]}";
      if ( isset($pieces[2]) ) $redirect .= "/{$pieces[2]}";
      $cached[ serialize($pieces) ] = $redirect;
      set_transient(\'my_redirects\', $cached);
      wp_safe_redirect( home_url( $redirect ), 301 );
      exit();
    }
    
    用于1个URL的第二个函数

    function my_post_redirect( Array $pieces ) {
      $cached = redirect_if_cached( $pieces );
      // if we are here url is not cached, see redirect_if_cached() below
      if ( ! count( $pieces ) === 1 ) return;
      global $wpdb;
      $query =  "SELECT ID, post_name FROM {$wpdb->posts} WHERE (post_status = \'publish\'";
      $query .= ( is_user_logged_in() ) ? " OR post_status = \'private\')" : \')\';
      $query .= " AND post_type = \'post\' AND post_name = %s";
      $post = $wpdb->get_row( $wpdb->prepare( $query, $pieces[0] ) );
      if ( empty($post) ) return;
      // that\'s a valid slug
      // cache and redirect
      $redirect = "{$post->ID}/{$pieces[0]}";
      $cached[ serialize( $pieces ) ] = $redirect;
      set_transient( \'my_redirects\', $cached );
      wp_safe_redirect( home_url( $redirect ), 301 );
      exit();
    }
    
    实现缓存

    function redirect_if_cached ( Array $pieces ) {
      $cached = array_filter( (array) get_transient(\'my_redirects\') );
      $key = serialize( $pieces );
      if ( array_key_exists( $key, $cached ) ) {
        wp_safe_redirect( home_url( $cached[$key] ), 301 );
        exit();
      }
      // if url is not cached return what\'s currently cached
      return $cached;
    }
    

结束

相关推荐

Wp-admin中的.htaccess会产生重定向循环

我决定接受保护/wp-admin 目录使用。htaccess网站不断遭到黑客攻击。每当我上传时。htaccess访问/wp-admin, 我的浏览器显示/wp-admin 具有重定向循环。这是/wp-admin/.htaccess:AuthUserFile /.../.htpasswd AuthType Basic AuthName “restricted” Order Deny,Allow Deny from all Require valid-user