web-dev-qa-db-ja.com

'user_has_cap'フックはトリガするのに2ページの読み込みを要するようです

この質問は私が最近尋ねたもう一つの質問に関連しています(http://wordpress.stackexchange.com/questions/29009/how-to-assign-specific-users-the-capability-to-edit-specific-pages-posts-cus/答えは私がやろうとしていたことへの道のほとんどを私に与えた。しかし、その質問を更新し続けるのではなく、新しい問題を投稿するほうが良いと思いました。

私は基本的にReadアクセスをユーザーごとにカスタム投稿タイプ(プロジェクト)に制限しています。私はuser_has_capフックを使用しています。ページを読み込もうとしているユーザーが投稿タイプのIDを持っているかどうか確認します。配列に現在の投稿IDが含まれているかどうかに応じて、ユーザーに割り当てられます。それに応じて読み取り機能が追加または削除されます。これは次のコードで行われます。

function allow_user_to_read_cpt_filter($allcaps, $cap, $args) {
    global $current_user; // Get user id
    get_currentuserinfo(); //...
    $userid = $current_user->ID; //...
    $wos_uspr_checked_read_ids = explode(',',esc_attr(get_the_author_meta('wos_uspr_read_data', $userid)));
    /* The above is a comma separated list of IDS, e.g. 724,736,784 */
    global $wpdb;
    $post = get_post($args[2]);
    if (!in_array($post->ID, $wos_uspr_checked_read_ids)) {
        $user = wp_get_current_user();
        $user->remove_cap('read_project');
        $user->remove_cap('read_projects');
        $user->remove_cap('read_others_projects');
        $user->remove_cap('read_published_projects');       
    } else {
        $user = wp_get_current_user();
        $user->add_cap('read_project');
        $user->add_cap('read_projects');
        $user->add_cap('read_others_projects');
        $user->add_cap('read_published_projects');
    }

    return $allcaps;
}

add_filter('user_has_cap', 'allow_user_to_read_cpt_filter', 100, 3);

(はい、私は以前の質問に対する答えとは異なるコードを使用しました。考えていませんこれが問題の原因となっています。能力を割り当てる他の方法を使ったことがあるなら、私はちょうど上の方法を使うことを好む。)

とにかく、私がこれに遭遇している問題は私の投稿タイプのコンテンツが隠されている前にそれがページの2つの負荷を取っているということです。私のページで使用しているコードは次のようになります。

if (current_user_can('read_projects')) {
    echo '<p>Yes, you can read this.</p>';
} else if (!current_user_can('read_projects')) {
    echo '<p>No, you cannot read this.</p>';
}

最初のロードでコンテンツを表示または非表示にするためにページがロードされたときにフックが十分に素早くトリガーされていなかったと私は思いますが、user_has_capがトリガーされたときの答えを見つけるのに苦労しています。

4
Rick Curran

私はようやく要求された振る舞いを得ることができました、私は私の質問で示した例から更新されたコードを使うことになりました - そして実際に私が私の質問テキストで参照した質問で提案されたコードに近い!これが最後に機能したコードです。

function allow_user_to_edit_cpt_filter($allcaps, $cap, $args) {
    global $current_user; // Get user id
    get_currentuserinfo(); //...
    $userid = $current_user->ID; //...
    $a_user = new WP_User($userid); // Get user details
    if ($a_user->roles[0] != 'administrator')  { // Don't apply if administrator
        $wos_uspr_checked_edit_ids = explode(',',esc_attr(get_the_author_meta('wos_uspr_edit_data', $userid)));
        global $wpdb;
        $post = get_post($args[2]);
            // UPDATED CODE BLOCK BEGINS
        if (!in_array($post->ID, $wos_uspr_checked_edit_ids)) {
            if (($args[0] == "edit_project") || ($args[0] == "edit_others_projects") || ($args[0] == "edit_published_projects")) {
                foreach((array) $cap as $capasuppr) {
                   if (array_key_exists($capasuppr, $allcaps)) {
                      $allcaps[$capasuppr] = 0;
                   }
                }
            }
        }
            // UPDATED CODE BLOCK ENDS
    }
    return $allcaps;
}
add_filter('user_has_cap', 'allow_user_to_edit_cpt_filter', 100, 3);

私の質問で引用したものの代わりにこのコードを使用すると、最初のページの読み込み時に正しくトリガーされるように思われ、私のコンテンツは最初の閲覧から制限されます。私は以前にこのフォーマットを試してみたが成功しなかったと確信しているが、それは今は望み通りに働いている。

1
Rick Curran