Snippet
For David PMProunknown
plain_text
a year ago
7.5 kB
4
Indexable
function pmpro_custom_search_filter( $query ) { global $current_user, $wpdb, $pmpro_pages; //hide pmpro pages from search results if( ! $query->is_admin && $query->is_search && empty( $query->query['post_parent'] ) ) { //avoiding post_parent queries for now if( empty( $query->query_vars['post_parent'] ) && ! empty( $pmpro_pages ) ) { $query->set( 'post__not_in', array_merge( $query->get('post__not_in'), array_values( $pmpro_pages ) ) ); } } // If this is a post type query, get the queried post types into an array. if ( ! empty( $query->query_vars['post_type'] ) ) { // Get the post types in the query and cast the string to an array. if ( is_array( $query->query_vars['post_type'] ) ) { $query_var_post_types = $query->query_vars['post_type']; } else { $query_var_post_types = array( $query->query_vars['post_type'] ); } } else { $query_var_post_types = array(); } /** * Filter which post types to hide members-only content from search. * * @param array $pmpro_search_filter_post_types The post types to include in the search filter. * The default included post types are page and post. * * @return array $pmpro_search_filter_post_types. */ $pmpro_search_filter_post_types = apply_filters( 'pmpro_search_filter_post_types', array( 'page', 'post' ) ); if ( ! is_array( $pmpro_search_filter_post_types ) ) { $pmpro_search_filter_post_types = array( $pmpro_search_filter_post_types ); } //hide member pages from non-members (make sure they aren't hidden from members) if( !$query->is_admin && !$query->is_singular && empty($query->query['post_parent']) && ( empty($query->query_vars['post_type']) || array_intersect( $query_var_post_types, $pmpro_search_filter_post_types ) ) && ( ( ! defined('REST_REQUEST') || ( defined( 'REST_REQUEST' ) && false === REST_REQUEST ) ) ) ) { //get page ids that are in my levels if( ! empty( $current_user->ID ) ) { $levels = pmpro_getMembershipLevelsForUser($current_user->ID); } else { $levels = false; } $my_pages = array(); $member_pages = array(); if( $levels ) { foreach( $levels as $key => $level ) { //get restricted posts for level // make sure the object contains membership info. if ( isset( $level->ID ) ) { $sql = $wpdb->prepare(" SELECT page_id FROM {$wpdb->pmpro_memberships_pages} WHERE membership_id = %d", $level->ID ); $member_pages = $wpdb->get_col($sql); $my_pages = array_unique(array_merge($my_pages, $member_pages)); } } // foreach } // if($levels) //get hidden page ids if( ! empty( $my_pages ) ) { $sql = "SELECT page_id FROM $wpdb->pmpro_memberships_pages WHERE page_id NOT IN(" . implode(',', array_map( 'esc_sql', $my_pages ) ) . ")"; } else { $sql = "SELECT page_id FROM $wpdb->pmpro_memberships_pages"; } $hidden_page_ids = array_values(array_unique($wpdb->get_col($sql))); if( $hidden_page_ids ) { //avoiding post_parent queries for now if( empty( $query->query_vars['post_parent'] ) ) { $query->set( 'post__not_in', array_merge( $query->get('post__not_in'), $hidden_page_ids ) ); } } //get categories that are filtered by level, but not my level global $pmpro_my_cats; $pmpro_my_cats = array(); if( $levels ) { foreach( $levels as $key => $level ) { $member_cats = pmpro_getMembershipCategories($level->id); $pmpro_my_cats = array_unique(array_merge($pmpro_my_cats, $member_cats)); } } //get hidden cats if( ! empty( $pmpro_my_cats ) ) { $sql = "SELECT category_id FROM $wpdb->pmpro_memberships_categories WHERE category_id NOT IN(" . implode(',', array_map( 'esc_sql', $pmpro_my_cats ) ) . ")"; } else { $sql = "SELECT category_id FROM $wpdb->pmpro_memberships_categories"; } $hidden_cat_ids = array_values(array_unique($wpdb->get_col($sql))); //make this work if( $hidden_cat_ids ) { $query->set( 'category__not_in', array_merge( $query->get( 'category__not_in' ), $hidden_cat_ids ) ); //filter so posts in this member's categories are allowed add_action( 'posts_where', 'pmpro_posts_where_unhide_cats' ); } /**********************************************************/ // Fix for page require multiple levels $query->set( 'category__not_in', array() ); //get page ids that are in my levels if( ! empty( $current_user->ID ) ) { $levels = pmpro_getMembershipLevelsForUser($current_user->ID); } else { $levels = false; } //get categories that are filtered by level, but not my level global $pmpro_my_cats; $pmpro_my_cats = array(); if( $levels ) { foreach( $levels as $key => $level ) { $member_cats = pmpro_getMembershipCategories($level->id); $pmpro_my_cats = array_unique(array_merge($pmpro_my_cats, $member_cats)); } } //get hidden cats if( ! empty( $pmpro_my_cats ) ) { $sql = "SELECT category_id FROM $wpdb->pmpro_memberships_categories WHERE category_id NOT IN(" . implode(',', array_map( 'esc_sql', $pmpro_my_cats ) ) . ")"; } else { $sql = "SELECT category_id FROM $wpdb->pmpro_memberships_categories"; } $hidden_cat_ids = array_values(array_unique($wpdb->get_col($sql))); if( ! empty( $hidden_cat_ids ) ) { $sql = "SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id IN (" . implode(',', array_map( 'esc_sql', $hidden_cat_ids ) ) . ")"; $hidden_page_ids = array_values(array_unique($wpdb->get_col($sql))); $page_levels = ""; $i = 0; foreach ( $levels as $key => $level ) { if ($i > 0) { $page_levels .= " OR "; } $level_strlen = strlen($level->ID); $page_levels .= "membership_id = {$level->ID}"; $i++; } $sql = "SELECT page_id FROM $wpdb->pmpro_memberships_pages WHERE $page_levels;"; $pages_in = array_values(array_unique($wpdb->get_col($sql))); foreach ($pages_in as $page_id) { $key = array_search($page_id, $hidden_page_ids); if ($key !== false) { unset($hidden_page_ids[$key]); } } $query->set( 'post__not_in', array_merge( $query->get('post__not_in'), $hidden_page_ids) ); } } // Hide posts that the member can't access yet. if ( $query->is_home() && $query->is_main_query() ) { // Get all posts that are part of a series. $pmpros_query_args = array( 'post_type' => 'post', // Query performance optimization. 'fields' => 'ids', 'no_found_rows' => true, 'posts_per_page' => -1, 'meta_key' => '_post_series', ); $hidden_post_ids = array(); $pmpros_query = new WP_Query( $pmpros_query_args ); if ( $pmpros_query->posts ) { foreach ( $pmpros_query->posts as $key => $post_id ) { if ( ! pmpros_hasAccess( $current_user->ID, $post_id ) ) { $hidden_post_ids[] = $post_id; } } } if( isset( $_GET['ax'] ) ) { var_dump($hidden_post_ids); } $query->set( 'post__not_in', array_merge( $query->get('post__not_in'), $hidden_post_ids ) ); } return $query; } $filterqueries = pmpro_getOption( 'filterqueries' ); if ( ! empty( $filterqueries ) ) { remove_filter( 'pre_get_posts', 'pmpro_search_filter' ); add_filter( 'pre_get_posts', 'pmpro_custom_search_filter' ); }
Editor is loading...
Leave a Comment