web-dev-qa-db-ja.com

Nice_nicknameを使用するようにグループとslugで作者ベースのslugを修正するにはどうすればいいですか?

Jan Fabry からのURL書き換えと著者スラッグに関する以下の提案を読んだ後、私は両方の解決策を一つにまとめることに挑戦しました。

目標:これの目的は、作者のための構造を次のようにすることです。

http://domain.tld/employees/(department|group)/firstname-lastname

現在の解決策:これを手配するために、私は次のように参照された答えで述べられているように解決策をマージしました:

// NOTE: This need to be stored different and need to be attached to author/profile
//       Will be added to user settings so this can be changed (only primary group will be stored)
$wpa04142013_author_groups = array( 'staff', 'admin', 'support', 'itnerds', 'etc' );

/*
 * Init WordPress to add globals which can be used for the authors and levels of the authors.
 */
add_action( 'init', 'wpa04142013_init' );
function wpa04142013_init()
{
    global $wp_rewrite;
    $author_groups = $GLOBALS['wpa04142013_author_groups'];

    // Define the tag and use it in the rewrite rule
    add_rewrite_tag( '%author_group%', '(' . implode( '|', $author_groups ) . ')' );
    $wp_rewrite->author_base = 'employees/%author_group%';
}

上記の解決策は、最初に定義された目標に基づいてauthor_baseが必要に応じて変更されることを確認します。その後、著者アーカイブページへの正しいリンクを使用するためにauthor_linkを他にフックする必要があります。

add_filter( 'author_link', 'wpa04142013_author_link', 10, 3 );
function wpa04142013_author_link( $link, $author_id, $author_nicename )
{
    //NOTE: This if/else needs to be changed --> either select case and use
    //      global defined groups based upon user property
    if ( 1 == $author_id ) {
        $author_group = 'staff';
    } else {
        $author_group = 'admin';
    }
    $link = str_replace( '%author_group%', $author_group, $link );

    //Below solution added from other WordPress Answers suggestion
        $author_nickname = get_user_meta( $author_id, 'nickname', true );
    if ( $author_nickname ) {
        $link = str_replace( $author_nicename, $author_nickname, $link );
    }

    return $link;
}

上記の実装後、作者へのリンクは正しく機能していますが、リクエストとURLの書き換えは機能していません。著者のリンクをクリックすると、テンプレートの404ページが表示されます。

私が誤解していないのなら、私も次のセクションを修正する必要がありますが、これはそれが間違っているところです。

/*
 * Hook into 'request' to modify the author request.
 * Change the way the lookup works (via nickname in stead of the slug)
 */
add_filter( 'request', 'wpa04142013_request' );
function wpa04142013_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'] ) );
        if ( $author_id ) {
            $query_vars['author'] = $author_id;
            unset( $query_vars['author_name'] );   
        }
    }
    return $query_vars;
}

add_filter( 'author_rewrite_rules', 'wpa04142013_author_rewrite_rules' );
function wpa04142013_author_rewrite_rules( $author_rewrite_rules )
{
    foreach ( $author_rewrite_rules as $pattern => $substitution ) {
        if ( FALSE === strpos( $substitution, 'author_name' ) ) {
            unset( $author_rewrite_rules[$pattern] );
        }
    }
    return $author_rewrite_rules;
}

私はすでに Dutch WordPressサポートフォーラム で助けを得ていますが、それでも正しい解決策を見つけることにはまっています。また、Rewrite Analyzerで書き換えを調べましたが、author_groupが見つかりませんでした。うまくいけば、あなたは私が正しい方向に私を指すのを助けることができます。

4
Ruben Woudsma

編集:前の答えがうまくいかなかった。次の解決策はサニタイズされたニックネームを提供しませんが、トリックをするべきです:

    $nn = urldecode($query_vars['author_name'] );
    $author_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key='nickname' AND meta_value = %s", $nn ) );
2
diggy

追加のテストをいくつか実行したところ、次のような結論に達しました。 上記の答え に加えて、変更を適用するためにパーマリンクをフラッシュするのはrequiredです。 functions.php.

  1. Functions.phpへの変更を保存します
  2. [オプション] - > [パーマリンク]を開きます。

変更を保存する必要はありません、ただページを訪問することはパーマリンクをフラッシュするのに十分です。さらに、書き換えアナライザを使って新しい書き換えルールを検証する必要があります。変更が利用できない場合は、上記の手順に従ってパーマリンクをフラッシュします。

Rewrite rules regarding author base and page slug with groups

0
Ruben Woudsma