Snippet
For David PMProunknown
plain_text
a year ago
7.5 kB
5
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