自定义WordPress用户固定链接

时间:2013-11-10 作者:Dan

我的wordpress网站有点问题。我需要更改用户永久链接。permalinks应该包含来自wp\\u usermeta表的数据。我做了一些功能,链接也更改了,但当我访问它们时,它会显示:找不到页面。如果你能告诉我我的密码出了什么问题,我就请你喝杯啤酒。代码如下:

add_filter( \'request\', \'wpse5742_request\' );
function wpse5742_request( $query_vars )
{
    if ( array_key_exists( \'author_name\', $query_vars ) ) {
        global $wpdb;
        $author_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key=\'nickname\' AND meta_value = %s", $query_vars[\'author_name\'] ) );
        $query_vars[\'author\'] = $author_id;
        unset( $query_vars[\'author_name\'] );    
    }
    return $query_vars;
}

add_filter( \'author_link\', \'wpse5742_author_link\', 10, 3 );
function wpse5742_author_link( $link, $author_id, $author_nicename )
{
    $part1 = get_user_meta( $author_id, \'nickname\', true );
    $part2 = get_user_meta( $author_id, \'_themex_city\', true );
    $part3 = get_user_meta( $author_id, \'_themex_thesubject\', true );
    $newlink  = $part1.\'/\'.$part2.\'/\'.$part3;

    if ( $newlink ) {
        $link = str_replace( $author_nicename, $newlink, $link );
    }
    return $link; 
}

add_action( \'user_profile_update_errors\', \'wpse5742_set_user_nicename_to_nickname\', 10, 3 );
function wpse5742_set_user_nicename_to_nickname( &$errors, $update, &$user )
{
    if ( ! empty( $user->nickname ) ) {
        $user->user_nicename = sanitize_title( $user->nickname, $user->display_name );
    } }
我要创建的永久链接是:example.com/username/city/occupation

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

这个问题的问题,以及许多类似的问题,是由@Milo 在注释中:如果您编写重写规则来处理自定义url,这与WordPress规则冲突,例如,如果您的url

htt://example.com/username/city/occupation
WordPress如何知道您是否在查找页面occupation 页面的子级city 第页的granchildusername?

答案是can\'t, 除非您对数据库进行查询,以查看username part是否为真实用户名。

为了简化这类事情,我编写了一个名为“聪明的规则”的插件,在这个回答中,我将使用我用于该插件的技术。这项技术不能在主题中使用,但需要在插件中使用,因此我为这个anwser编写了一个小插件,它使用了从代码中提取的2个函数(只是稍微优化了一点)和一个小类来实现神奇的效果。

它的工作原理我创建了一个扩展WP 类别$wp 变量(通常包含WP) 使用我的类的一个实例。这只包含一个方法:parse_request 该覆盖WP 方法,所以当按调用时parse_request 我的类被称为核心类而不是核心类parse_request 运行

代码

<?php
/**
 * Plugin Name: GM Custom Author Url WPSE Q#122829
 * Plugin URI: http://wordpress.stackexchange.com/questions/122829/custom-wordpress-user-permalink
 * Author: G.M.
 * Author URI: http://wordpress.stackexchange.com/users/35541/g-m
 *
 */
class GMWPE extends WP {    
  function parse_request( $extra_query_vars = \'\' )
  {
    $home_path = trim( parse_url( home_url(), PHP_URL_PATH ), \'/\' );
    $full = str_replace( $home_path, \'\', add_query_arg( array() ) );
    $sane_array = explode( \'?\', $full );
    $sane = trim( $sane_array[0], \'/\\\\\' );
    $parts = array_filter( explode( \'/\', $sane ) );
    if ( count($parts) === 3 ) {
      $maybe_author = $parts[0];
      $user = get_user_by(\'slug\', $maybe_author);
      if ( $user !== false ) {
        remove_filter( \'template_redirect\', \'redirect_canonical\' );
        $this->query_vars = array( \'author\' => $user->ID );
        return;
      }
    }
    parent::parse_request( $extra_query_vars = \'\' );
  } 
}

add_action( \'setup_theme\', \'GMWPE_init\', 9999 );
function GMWPE_init() {
  global $wp;
  if ( get_class( $wp ) === \'WP\' ) $wp = new GMWPE();
}

add_filter( \'author_link\', \'gmcau_author_link\', 10, 3 );
function gmcau_author_link( $link, $author_id, $author_nicename )
{
  $part2 = get_user_meta( $author_id, \'_themex_city\', true );
  $part3 = get_user_meta( $author_id, \'_themex_thesubject\', true );
  if ( $part2 && $part3 ) {
    $newlink  = $author_nicename . \'/\' . $part2 . \'/\' . $part3;
    $link = home_url( $newlink );
  }
  return $link; 
}

add_action( \'user_profile_update_errors\', \'gmcau_set_user_nicename_to_nickname\', 10, 3 );
function gmcau_set_user_nicename_to_nickname( &$errors, $update, &$user )
{
  if ( ! empty( $user->nickname ) ) {
   $user->user_nicename = sanitize_title( $user->nickname, $user->display_name );
  }
}
这是您唯一需要的(您可以删除发布的函数)。将此代码保存在一个文件中,将其放在插件文件夹中,并从仪表板中激活它。

PS:如果你有兴趣看看我的插件,它使用这种技术提供灵活的URL处理,你可以找到它here.

结束

相关推荐

old permalinks not found

通过Google网站管理员工具查看,我有很多404个永久链接结构为/%年%/%月%/%日%/%postname%的帖子/此后,我将永久链接更改为/%类别%/%postname%。html我原以为Wordpress可以将旧的帖子URL重定向到新的帖子URL,但旧的基于日期的URL正在生成404。我的htaccess文件可写,设置为644。为什么会发生这种情况?谢谢