web-dev-qa-db-ja.com

パスワード保護された投稿を管理者に隠す

私はクライアントのためのサイトを構築しています、そして我々はWordPressのネイティブパスワード保護機能を使用しています。

管理パネルで取得した投稿をフィルタリングするためのフィルタまたは何らかのアクションがありますか。パスワードで保護されたすべての投稿が管理者パネルに表示されないようにするには、管理者ではないとします。

4
Dueify

has_passwordWP_Query パラメーターを使用できます。

これは管理者以外のユーザーが投稿投稿タイプのedit.php画面で非表示にする方法の例です。

/**
 * Hide password protected posts, for non-admins, in the case of 'edit-post' screen id
 *
 * @link http://wordpress.stackexchange.com/a/200426/26350
 */
add_action( 'pre_get_posts', function( \WP_Query $q )
{
    $screen = get_current_screen();

    if(    is_admin() 
        && ! current_user_can( 'manage_options' ) 
        && is_a( $screen, '\WP_Screen' ) 
        && 'edit-post' === $screen->id
    )
        $q->set( 'has_password', false );
} );

うまくいけばあなたはあなたのニーズに合わせてこれを調整することができます。

PS:get_current_screen_id()関数に似たget_current_user_id()関数があると便利でしょう;-)

更新

/**
 * Hide password protected posts, for non-admins, in the case of 'edit-post' screen id. 
 * Here we don't restrict this to the current user.
 *
 * @link http://wordpress.stackexchange.com/a/200426/26350
 */
is_admin() && add_action( 'posts_where', function( $where, \WP_Query $q )
{
    $screen = get_current_screen();

    if(     
           ! current_user_can( 'manage_options' ) 
        && is_a( $screen, '\WP_Screen' ) 
        && 'edit-post' === $screen->id
    ){
        global $wpdb;
        $uid = get_current_user_id();
        $where .= $wpdb->prepare(
            " AND ( ( {$wpdb->posts}.post_password = '' AND {$wpdb->posts}.post_author != %d )
              OR ( {$wpdb->posts}.post_author = %d ) ) ",
            $uid,
            $uid
        );
    }
    return $where;
}, 10, 2 );

WP_Queryfield_queryをサポートするならば:

投稿フィールドでの作業を簡単にするために、WP_Queryfield_query入力引数をサポートすると便利です。

これが例です:

add_action( 'pre_get_posts', function( \WP_Query $q )
{
    $screen = get_current_screen();

    if(    is_admin() 
        && ! current_user_can( 'manage_options' ) 
        && is_a( $screen, '\WP_Screen' ) 
        && 'edit-post' === $screen->id
    )
        $q->set( 'field_query', 
            [
                'outer_relation' => 'AND',
                'relation'       => 'OR',
                [ 
                    'field'   => 'author',
                    'value'   => get_current_user_id(),
                    'compare' => '=',
                ],
                [
                    'relation'  => 'AND',
                    [
                        'field'     => 'author',
                        'value'     => get_current_user_id(),
                        'compare'   => '!=',
                    ],
                    [
                        'field'     => 'password',
                        'value'     => '',
                        'compare'   => '=',
                    ],
                ]       
            ]
        );
} );

私はそのようなプラグインのためのドラフトを持っているので、多分私はそれがアルファ段階に達したときにここにそれを投稿するでしょう; - )

3
birgire