קטגוריות
הרחבות לווקומרס

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

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

add_filter( 'upl_query', 'upl_unrestrict_user' );
function upl_unrestrict_user( $args ) {
	$post_type = 'post';
	$user_id = 12;
	if ( $post_type === $args['post_type'] && $user_id === $args['author'] ) {
		$args['post_type'] = 'none';
	}
	return $args;
}

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

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;
	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;
}

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

איך להגדיר סוגי הודעה שונים לכל משתמש?
השתמש בפילטרים upl_message ו-upl_notice.

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

$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 );

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

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 );
	}
}

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

add_action( 'woocommerce_order_status_completed', 'upl_update_user_cycle' );
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_update_user_cycle( $order_id ) {
	$product_id = '683';
	$order = wc_get_order( $order_id );
	$user_id = $order->get_user_id();
	if ( ! user_can( $user_id, 'manage_options' ) ) {
		foreach ( $order->get_items() as $item ) {
			if ( $product_id == $item->get_product_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;
			}
		}
	}
}

function upl_users_cycle( $args, $i ) {
	if ( ! user_can( $args['author'], '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( '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" /></td>
				</tr>
			</table>
			<br />
		<?php
	}
}

function upl_save_cycle_user_data( $user_id ) {
	if ( current_user_can( '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 ) {
	if ( 'cycle' === $column_id_attr ) {
		return get_user_meta( $user_id, 'cycle', true );
	}
	return $row_output;
}

איך לעשות שהחוקים על ה-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;
}
קטגוריות
ווקומרס

אבטחת ווקומרס

וחדר הסודות.

שיפור אבטחת המערכת ברמת הוורדפרס:

  • אבטח את השרת
  • הענק הרשאות: 755 לתיקיות, 644 לקבצים
  • עדכן באופן תדיר
  • התקן תוספים מעטים ככל האפשר
  • דווח על כל פעילות חשודה בחשבון לספק האחסון שלכם
  • השתמש בכלי המובנה "בריאות אתר"
  • הסר תבניות שלא בשימוש
  • התקן תעודת SSL
  • השתמש במשתמש מסוג "עורך" והתחבר לאדמין רק בעת הצורך
  • ביטול עורך התבניות המובנה בלוח הבקרה- הוסף לקובץ wp-config.php את ההוראה:
define( 'DISALLOW_FILE_EDIT', true );
  • מניעת אופציית הדפדוף בתיקיות, גישה לקבצים ותיקיות חשובים, והתקפות XSS- הוסף לקובץ htaccess. את ההוראות:
Options -Indexes

<FilesMatch "^.*(xmlrpc.php|error_log|wp-config\.php|php.ini|\.[hH][tT][aApP].*)$">
Order deny,allow
Deny from all
</FilesMatch>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
# Comment the following directive if multisite
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] 
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>

RewriteCond %{HTTP_USER_AGENT} (libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (;|<|>|'|"|\)|\(|%0A|%0D|%22|%27|%28|%3C|%3E|%00).*(libwww-perl|wget|python|nikto|curl|scan|java|winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR]
RewriteCond %{THE_REQUEST} \?\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} \/\*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} etc/passwd [NC,OR]
RewriteCond %{THE_REQUEST} cgi-bin [NC,OR]
RewriteCond %{THE_REQUEST} (%0A|%0D) [NC,OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR]
RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR]
RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR]
RewriteCond %{QUERY_STRING} ftp\: [NC,OR]
RewriteCond %{QUERY_STRING} http\: [NC,OR] 
RewriteCond %{QUERY_STRING} https\: [NC,OR]
RewriteCond %{QUERY_STRING} \=\|w\| [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)/self/(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR] 
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>).* [NC,OR]
RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR]
RewriteCond %{QUERY_STRING} (\./|\../|\.../)+(motd|etc|bin) [NC,OR]
RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR]
RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR]
RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR]
RewriteCond %{QUERY_STRING} (;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC,OR]
RewriteCond %{QUERY_STRING} (sp_executesql) [NC]
RewriteRule ^(.*)$ - [F,L]
  • ביטול אפשרות להרצת PHP- צור קובץ htaccess. בתיקיית ההעלאות עם התוכן:
<Files "*.php">
Order Deny,Allow
Deny from All
</Files>
  • הסתרת גרסת הוורדפרס ושגיאות התחברות- הוסף לקובץ functions.php שבתבנית הבת:
add_filter( 'the_generator', '__return_false' );
add_filter( 'login_errors', create_function( '$a', "return 'Invalid Input';" ) );
  • סרוק באופן תדיר את הקוד בתיקיית הוורדפרס ובבסיס הנתונים לאיתור נוזקות ומחק פריטים מיותרים, בצע גיבוי מלא לפני כל שינוי, שקול להתקין את וורדפרס מחדש דרך לוח הבקרה (קבצי הליבה, התבניות והתוספים), היעזר בפקודה למציאת הקבצים ששונו לאחרונה:
find ./ -type f -mtime -15

הסרת נוזקת הפרסומות הקופצות במובייל- מחק את הקבצים wp-tmp.php ,wp-vcd.php ,wp-feed.php מהתיקיה wp-includes, ואת הקוד שיוצר אותם מהקובץ functions.php שבתבניות.

הסרת נוזקת Japanese Keyword Hack- נקה את הקוד הזדוני מהקבצים htaccess. ,wp-config.php ,sitemap.xml ומתיקיית ההעלאות.

כפי שבוודאי שמת לב- מספר רב של נוזקות לוורדפרס, אינן נוצרו במטרה להפיל את האתר כליל, אלא להשתמש בתשתית שלו וליצור תנועת גולשים לרכישת מוצרים באתר צד שלישי, לרוב מוצרי טיפוח ובריאות אשר אסורים לפרסום במדיה הרגילה.

קטגוריות
ווקומרס

פופאפים בווקומרס

ואמני הג'אז.

התקן את התוסף.

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

add_filter( 'pum_get_conditions', 'condless_pum_cart_product_quantity_conditions' );
function condless_pum_cart_product_quantity_conditions( $conditions ) {
	return array_merge( $conditions, [
		'password_page_unlocked' => [
			'group'		=> __( 'Products', 'woocommerce' ),
			'name'		=> __( 'Products', 'woocommerce' ) . ': ' . __( 'Cart', 'woocommerce' ) . ' ' . __( 'Quantity', 'woocommerce' ),
			'callback'	=> 'cart_product_quantity',
		]
	] );
}

function cart_product_quantity() {
	foreach ( WC()->cart->get_cart() as $cart_item ) {
		if ( '772' === $cart_item['product_id'] && 3 > $cart_item['quantity'] ) {
			return true;
		}
	}
	return false;
}

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

  • הפעל את האפשרויות של השורטקודים ושל הקלאסים בכפתור הוספה לסל שבתוסף
  • צור פופאפ בשם simple_is_on_backorder1 וטרגטינג של All Products
  • בתוכן הפופאפ הכנס את השורטקוד [current_add_to_cart] והתראה ללקוח על שעומד להוסיף מוצר שאינו זמין כרגע
  • במידה ומוגדר AJAX בעמוד ארכיון צור פופאפ נוסף עם טריגר Click Open על archive_is_on_backorder1. והאפשרות "do not prevent.." והכנס בתוכן הפופאפ התראה ללקוח על שהוסיף מוצר שאינו זמין כרגע, במידה ולא השתמש בקוד:
add_filter( 'woocommerce_loop_add_to_cart_args', 'condless_add_class', 10, 2 );
function condless_add_class( $args, $product ) {
	if ( $product->is_type( 'simple' ) && $product->is_on_backorder() && ! is_product() && 'no' === get_option( 'woocommerce_enable_ajax_add_to_cart' ) ) {
		$product_id = $product->get_id();
		$args['class'] .= ' popmake-archive_backorder-' . $product_id;
		$out = isset( $product->get_availability()['availability'] ) ? '<div>' . $product->get_availability()['availability'] . '</div>' . '<a href=' . $product->add_to_cart_url() . '>' . $product->add_to_cart_text() . '</a>' : '';
		echo do_shortcode( "[popup id='archive_backorder-" . $product_id . "']" . $out . "[/popup]" );
	}
	return $args;
}

כפי שבוודאי שמת לב- פסטוריוס, קרטר, ואלדס וכל שמות הקוד האחרים של גרסאות וורדפרס, הם שמות של אמני ג'אז מפורסמים, בהשראת מתכנתי הליבה של וורדפרס, אשר חולקים אהבה למוזיקת הג'אז.