Snippet

For David PMPro
 avatar
unknown
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