web-dev-qa-db-ja.com

ログインしていないユーザーからの投稿を隠す

ログインしていない人のために特定の投稿を非表示にします。コンテンツ制限(RC)プラグインを試しましたが、投稿の内容を非表示にしただけなので、投稿を完全に省略します。

基礎としてRCを使用して、私は以下を試みました:

function hideFromUnknownUsers($postObject) {
    $rcUserLevel = get_post_meta ( $postObject->ID, 'rcUserLevel', true );

    if(have_posts())
    {
        if (!(
                !current_user_can ( 'read' ) &&
                (
                    $rcUserLevel == 'Administrator' ||
                    $rcUserLevel == 'Editor' ||
                    $rcUserLevel == 'Author' ||
                    $rcUserLevel == 'Contributor' ||
                    $rcUserLevel == 'Subscriber'
                )
            )) {
            the_post();
        }
    }
}

add_action ( 'the_post', 'hideFromUnknownUsers' );

これには体系的なマイナス面があります。最後の投稿は無視できません。私は今のところそれと一緒に暮らすことができます。もう1つの問題は、これも無限ループを引き起こし、同じ投稿を何度も繰り返すことです。これは、have_posts()が最後の投稿の終わりに到達したことを示すだけでなく、投稿カウンタもリセットされてメインループが終了しないようにするという副作用があるためです。私がプラグインから$wp_query->current_post$wp_query->post_countに到達する方法を理解することができなかったので、非侵襲的であるhave_posts()を作ることは難しいと判明しました。

1つの解決策は直接テーマPHPファイルに上記のロジックを含めることですが、それは私がそれを面倒でエラーを起こしやすくする投稿にアクセスしようとするところはどこでも繰り返さなければならないでしょう。

未知のユーザーから特定の投稿を隠す他の方法はありますか?

3
Enok82

ユーザーロールをいじることはおそらく最も堅牢な解決策でしょうが、 メタデータを投稿する 隠すべき投稿にマークを付けてから メタクエリを追加する 投稿するのが手っ取り早い方法です。ログインしていないユーザーのために非表示の投稿に結果を制限するために a pre_get_postsフック を使用してクエリを実行します。

次の例では、ログアウトした訪問者に対して照会される all 投稿を、hide_from_guestsメタデータに関連付けられていない訪問者、またはそのメタデータを'false'に設定する訪問者に制限します。

function wpse225120_hide_posts_from_guests( $query ) {
  // If the user's logged in, exit the function now.
  if( is_user_logged_in() )
    return;

  // Get the current metadata query so we can alter it instead of overwriting it
  $meta_query = $query->get( 'meta_query' );

  // Create a meta-query filtering out hidden posts
  $hidden_meta_query = array(
    'relation' => 'OR',
    array(
      'key'     => 'hide_from_guests',
      'value'   => 'false'
    ),
    array(
      'key'     => 'hide_from_guests',
      'compare' => 'NOT_EXISTS'
    ) 
  );

  // If there's not already a meta-query, supply the one for hidden posts and exit
  if( ! is_array( $meta_query ) || empty( $meta_query ) ) {
    $query->set( 'meta_query', $hidden_meta_query );
    return;
  }

  // If there is an existing meta-query, modify it to support our new hidden posts
  // meta-query as a top-level 'AND' condition, if need be
  if( isset( $meta_query[ 'relation' ] ) && 'OR' === $meta_query[ 'relation' ] )
    $meta_query = array(
      'relation'  => 'AND',
      $meta_query
    );
  }

  // Add the hidden posts meta-query and overwrite $query's old meta-query
  $meta_query[] = $hidden_meta_query;
  $query->set( 'meta_query', $meta_query );
}
add_action( 'pre_get_posts', 'wpse225120_hide_posts_from_guests' );

このようにグローバルに every queryを変更することは一般に悪い習慣と考えられています。可能であれば、予期しない動作やパフォーマンスへの影響を防ぐために、 is_main_query() およびその他の 条件付きタグ を使用して、クエリの変更を適切なクエリだけに制限してください。

'hide_from_guests'投稿メタデータは、 カスタムフィールド interface、 投稿メタデータ関数 、カスタム メタボックスの実装 を使用して、関連する投稿タイプに添付することで、個々の投稿に設定できます。方法。

1
bosco

あなたの子供のテーマのfunctions.phpファイルにこのコードを使ってください。

//Hide for non-logged-in users (public visitors)
 function bp_logged_out_page_template_redirect() { if( ! is_user_logged_in() && is_page( 'members' )|| is_page( 'activity' ) || bp_is_user() ) { wp_redirect( home_url( '/register/' ) ); exit(); } } 
add_action( 'template_redirect', 'bp_logged_out_page_template_redirect' );

上記のコードは以下のようになります。

ユーザーがログインしていない場合。また、ページ名は 'members' OR 'activity' OR bp-profile-pageです。

参照: https://vvcares.com/w/wordpress-hide-pages-for-non-logged-in-users/

0
MAN5