הגבלת פוסטים למשתמש

איך לגרום לחוקים המוחלים על סוג פוסט מסוים להגביל את סך כל הפוסטים מסוג זה באתר?
עדכן את סוג הפוסט:

add_filter( 'upl_query', 'upl_limit_total_posts' );
function upl_limit_total_posts( $args ) {
	$post_type = 'post';
	if ( $post_type === $args['post_type'] ) {
		$args['author'] = '';
	}
	return $args;
}

איך לגרום לחוקים המוחלים על סוג פוסט מסוים להגביל לפי מספר הפוסטים הנמצאים בקטגוריות מסוימות בלבד?
עדכן את סוג הפוסט ואת ה-id של הקטגוריות (וודא שהמשתמשים אינם יכולים להעביר פוסט ל- או מקטגוריות אשר לא מוגבלות):

add_filter( 'upl_query', 'upl_specific_category' );
function upl_specific_category( $args ) {
	$post_type = 'post';
	$category_id = [ '4', '2' ];
	if ( $post_type === $args['post_type'] ) {
		$args['cat'] = $category_id;
	}
	return $args;
}

איך לגרום לחוקים המוחלים על סוג פוסט מסוים להגביל פוסטים בסטטוסים מסוימים?
עדכן את סוג הפוסט ואת הסטטוסים של הפוסטים (וודא שהמשתמשים אינם יכולים להעביר פוסט ל- או מסטטוס אשר לא מוגבל):

add_filter( 'upl_query', 'upl_specific_post_status' );
function upl_specific_post_status( $args ) {
	$post_type = 'post';
	$post_status = [ 'any' ];
	if ( $post_type === $args['post_type'] ) {
		$args['post_status'] = $post_status;
	}
	return $args;
}

איך לשנות את המחזוריות של חוקים המוחלים על סוג פוסט מסוים?
עדכן את סוג הפוסט ואת המחזוריות:

add_filter( 'upl_query', 'upl_modify_cycle' );
function upl_modify_cycle( $args ) {
	$post_type = 'post';
	$cycle = '3 days ago';
	if ( $post_type === $args['post_type'] ) {
		$args['date_query']['after'] = $cycle;
	}
	return $args;
}

איך להציג בלוח הבקרה רק את ההגבלות המאפשרות ביותר (רלוונטי כאשר למשתמשים יש מספר תפקידים)?

add_filter( 'upl_current_user_limits', 'upl_display_highest_rules' );
function upl_display_highest_rules( $limits ) {
	$post_type_limits = [];
	$permissive_limits = [];
	foreach ( $limits as $i => $count ) {
		if ( ! isset( $post_type_limits[ get_option( 'upl_posts_type' )[ $i ] ] ) || get_option( 'upl_num_limit' )[ $post_type_limits[ get_option( 'upl_posts_type' )[ $i ] ] ] < get_option( 'upl_num_limit' )[ $i ] ) {
			$post_type_limits[ get_option( 'upl_posts_type' )[ $i ] ] = $i;
		}
	}
	foreach ( $post_type_limits as $post_type => $i ) {
		$permissive_limits[ $i ] = $limits[ $i ];
	}
	return $permissive_limits;
}

איך לקבוע הגבלות פוסטים פר משתמש בכל החוקים שחלים על סוג פוסט מסוים?
עדכן את סוג הפוסט, ה-id של המשתמשים וההגבלות שלהם:

add_filter( 'upl_rule_num_limit', 'upl_user_num_limit', 10, 3 );
function upl_user_num_limit( $num_limit, $i, $user ) {
	$post_type = 'post';
	$limits = [
		'2'	=> '6',
		'4'	=> '7',
	];
	return $post_type === get_option( 'upl_posts_type' )[ $i ] && isset( $limits[ $user ] ) ? $limits[ $user ] : $num_limit;
}

איך לקבוע הגבלות על הכמות הכוללת של מספר סוגי פוסטים יחדיו?
עדכן את שמות החבילות ואת סוגי הפוסטים הכלולים בהן:

add_action( 'init', 'upl_create_packages' );
add_action( 'admin_init', 'upl_add_author_support' );
add_filter( 'upl_rule_limit_current_post_type_check', 'upl_convert_post_types', 10, 3 );
add_filter( 'upl_query', 'upl_apply_packages', 10, 2 );

function upl_create_packages() {
	$packages = [ 'Basic Package', 'Premium Package' ];
	foreach ( $packages as $package ) {
		register_post_type( sanitize_key( $package ), [ 'labels' => [ 'name' => $package ] ] );
	}
}

function upl_add_author_support() {
	$post_types = [ 'post', 'page', 'media' ];
	if ( current_user_can( get_option( 'upl_manage_cap' ) ) ) {
		foreach ( $post_types as $post_type ) {
			add_post_type_support( $post_type, 'author' );
		}
	}
}

function upl_convert_post_types( $check, $i, $current_post_type ) {
	$packages_types = [
		'Basic Package' => [ 'post', 'page' ],
		'Premium Package' => [ 'post', 'page', 'media' ]
	];
	foreach ( $packages_types as $package => $types ) {
		if ( sanitize_key( $package ) === get_option( 'upl_posts_type' )[ $i ] && in_array( $current_post_type, $types ) ) {
			return true;
		}
	}
	return $check;
}

function upl_apply_packages( $args, $i ) {
	$packages_types = [
		'Basic Package' => [ 'post', 'page' ],
		'Premium Package' => [ 'post', 'page', 'media' ]
	];
	foreach ( $packages_types as $package => $types ) {
		if ( sanitize_key( $package ) === get_option( 'upl_posts_type' )[ $i ] ) {
			$args['post_type'] = $types;
			break;
		}
	}
	return $args;
}

איך לקבוע את ההודעה שתופיע למשתמשים חסרי הגבלות בשורטקוד [upl_limits]?

add_filter( 'do_shortcode_tag', 'upl_shortcode_admin_message', 10, 2 );
function upl_shortcode_admin_message( $output, $tag ) {
	return 'upl_limits' === $tag && '' === $output ? esc_attr_e( 'Unlimited', 'user-posts-limit' ) : $output;
}

איך למנוע מהמשתמשים מלעבור על ההגבלות ע"י פתיחה של מס' חלונות של יצירת פוסטים (הטיוטות האוטומוטיות יבוטלו)?

add_filter( 'wp_revisions_to_keep', 'upl_disable_revisions', 10, 2 );
add_action( 'save_post', 'upl_disable_post_auto_draft', 10, 3 );

function upl_disable_revisions( $num, $post ) {
	return in_array( $post->post_type, get_option( 'upl_posts_type' ) ) ? false : $num;
}

function upl_disable_post_auto_draft( $post_id, $post, $update ) {
	if ( ! $update && in_array( $post->post_type, get_option( 'upl_posts_type' ) ) ) {
		wp_update_post( [ 'ID' => $post_id, 'post_status' => 'draft' ] );
	}
}

איך לשנות את ההגבלה בכל החוקים המוחלים על תפקיד משתמש מסוים דרך קוד?
עדכן את תפקיד המשתמש ואת ההגבלה:

for ( $i = 0; $i < get_option( 'upl_rules_count' ); $i++ ) {
	$role = 'subscriber';
	$limit = '3';
	if ( $role === get_option( 'upl_user_role' )[ $i ] ) {
		$limit_option = get_option( 'upl_num_limit' );
		$limit_option[ $i ] = $limit;
		update_option( 'upl_num_limit', $limit_option );
	}
}

איך ליצור חוק דרך קוד?
עדכן את תפקיד המשתמש, סוג הפוסט, ההגבלה והמחזוריות:

$role = 'author';
$type = 'post';
$limit = '2';
$cycle = 'day';
$formatted_cycle = '1 ' . $cycle . ' ago';
$role_option = get_option( 'upl_user_role' );
$type_option = get_option( 'upl_posts_type' );
$limit_option = get_option( 'upl_num_limit' );
$period_option = get_option( 'upl_period' );
$role_option[] = $role;
$type_option[] = $type;
$limit_option[] = $limit;
$period_option[] = $formatted_cycle;
update_option( 'upl_rules_count', get_option( 'upl_rules_count' ) + 1 );
update_option( 'upl_user_role', $role_option );
update_option( 'upl_posts_type', $type_option );
update_option( 'upl_num_limit', $limit_option );
update_option( 'upl_period', $period_option );
אינטגרציות

איך להפנות משתמשים לרכישת מוצר בווקומרס כאשר הם עברו את הגבלת הפוסטים של סוג פוסט מסוים?
עדכן את סוג הפוסט וה-id של המוצר:

add_filter( 'upl_notice', 'upl_wc_redirect', 10, 2 );
add_filter( 'upl_message', 'upl_wc_checkout', 10, 2 );

function upl_wc_redirect( $notice, $postarr ) {
	$post_type = 'post';
	return $post_type === $postarr['post_type'] ? 'redirect' : $notice;
}

function upl_wc_checkout( $message, $postarr ) {
	$post_type = 'post';
	$product = '11';
	return $post_type === $postarr['post_type'] ? wc_get_checkout_url() . "?add-to-cart=$product" : $message;
}

איך לקבוע שהחוקים על ה-Listing יחולו על כל Listing type בנפרד בתבנית MyListing?

add_filter( 'upl_query', 'upl_add_meta_query' );
function upl_add_meta_query( $args ) {
	if ( 'job_listing' === $args['post_type'] && isset( $_POST['listing_type'] ) ) {
		$args['meta_query'] = [
			[
				'key'	=> '_case27_listing_type',
				'value'	=> sanitize_text_field( $_POST['listing_type'] )
			]
		];
	}
	return $args;
}
איפוס ספירת הפוסטים

איך לאפשר איפוס ספירת פוסטים פר משתמש?

add_filter( 'upl_query', 'upl_users_cycle', 10, 2 );
add_action( 'show_user_profile', 'upl_add_cycle_user_data' );
add_action( 'edit_user_profile', 'upl_add_cycle_user_data' );
add_action( 'personal_options_update', 'upl_save_cycle_user_data' );
add_action( 'edit_user_profile_update', 'upl_save_cycle_user_data' );
add_filter( 'manage_users_columns', 'upl_cycle_user_table' );
add_filter( 'manage_users_custom_column', 'upl_cycle_user_table_row', 10, 3 );

function upl_users_cycle( $args, $i ) {
	if ( ! user_can( $args['author'], get_option( 'upl_manage_cap', 'manage_options' ) ) ) {
		$rule_role = '';
		$cycle = get_user_meta( $args['author'], 'cycle', true );
		if ( ( empty( $rule_role ) || $rule_role === get_option( 'upl_user_role' )[ $i ] ) && ! empty( $cycle ) && $cycle <= current_time( 'Y-m-d' ) ) {
			$args['date_query']['after'] = date( 'Y-m-d', strtotime( $cycle . ' - 1 day' ) );
		}
	}
	return $args;
}

function upl_add_cycle_user_data( $user ) {
	if ( current_user_can( get_option( 'upl_manage_cap', 'manage_options' ) ) ) { ?>
		<h3><?php esc_html_e( 'User Posts Limit', 'user-posts-limit' ); ?></h3>
		<table class="form-table">
			<tr>
				<th><label for="cycle"><?php esc_html_e( 'Cycle', 'user-posts-limit' ); ?></label></th>
				<td>
					<input type="date" min="1970-01-01" name="cycle" value="<?php echo esc_attr( get_user_meta( $user->ID, 'cycle', true ) ); ?>" class="regular-text" />
					<p class="description"><?php esc_html_e( 'Only posts created after this date will be counted', 'user-posts-limit' ); ?></p>
				</td>
			</tr>
		</table>
		<br>
	<?php }
}

function upl_save_cycle_user_data( $user_id ) {
	if ( current_user_can( get_option( 'upl_manage_cap', 'manage_options' ) ) ) {
		update_user_meta( $user_id, 'cycle', sanitize_text_field( $_POST['cycle'] ) );
	}
}

function upl_cycle_user_table( $columns ) {
	$columns['cycle'] = __( 'Cycle', 'user-posts-limit' );
	return $columns;
}

function upl_cycle_user_table_row( $row_output, $column_id_attr, $user_id ) {
	return 'cycle' === $column_id_attr ? get_user_meta( $user_id, 'cycle', true ) : $row_output;
}

איך לאפס את ספירת הפוסטים של משתמש כאשר הוא רוכש מנוי מסוים בתוסף Paid Memberships Pro (יתבצע בסוף היום)?
עדכן את ה-id של רמות המנויים:

add_action( 'pmpro_after_change_membership_level', 'upl_pmpro_update_user_cycle', 10, 2 );
function upl_pmpro_update_user_cycle( $level_id, $user_id ) {
	$membership_levels = [ '1', '2', '3' ];
	if ( ! user_can( $user_id, get_option( 'upl_manage_cap', 'manage_options' ) ) && in_array( $level_id, $membership_levels ) && ( empty( get_user_meta( $user_id, 'cycle', true ) ) || get_user_meta( $user_id, 'cycle', true ) <= current_time( 'Y-m-d' ) ) ) {
		update_user_meta( $user_id, 'cycle', date( 'Y-m-d', strtotime( current_time( 'Y-m-d' ) . ' + 1 day' ) ) );
	}
}

איך לאפס את ספירת הפוסטים של משתמש כאשר הוא רוכש מוצר מסוים בווקומרס (יתבצע בסוף היום)?
עדכן את ה-id של המוצרים:

add_action( 'woocommerce_order_status_completed', 'upl_wc_update_user_cycle' );
function upl_wc_update_user_cycle( $order_id ) {
	$products_id = [ '683' ];
	$order = wc_get_order( $order_id );
	$user_id = $order->get_user_id();
	if ( ! user_can( $user_id, get_option( 'upl_manage_cap', 'manage_options' ) ) ) {
		foreach ( $order->get_items() as $item ) {
			if ( in_array( $item->get_product_id(), $products_id ) ) {
				if ( empty( get_user_meta( $user_id, 'cycle', true ) ) || get_user_meta( $user_id, 'cycle', true ) <= current_time( 'Y-m-d' ) ) {
					update_user_meta( $user_id, 'cycle', date( 'Y-m-d', strtotime( current_time( 'Y-m-d' ) . ' + 1 day' ) ) );
				}
				break;
			}
		}
	}
}

השאירו תגובה

האימייל לא יוצג באתר.