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

מכירת מדיה בווקומרס

ואוניברסיטת ההמונים.

מכירת גישה למדיה דיגיטלית (עמודי תוכן, קורסי וידאו, תמונות, מוזיקה):

  • עקוב אחר ההוראות שבמדריך
  • התאם את התוסף לעברית:
add_action( 'admin_head', 'condless_admin_custom_css' );
function condless_admin_custom_css() {
	echo '<style> .chosen-container .chosen-drop { left: 9999px; } </style>';
}
  • הוסף בשדה "הערת רכישה" שבמוצר קישור לעמוד בו המדיה מוטמעת
  • הפעל הגנת תוכן עם התוסף
  • במידה והמדיה מאוחסנת בתיקיית המדיה של האתר חסום גישה ישירה אליה, בטל את האפשרות לשיטוט קבצים ול-hotlinking עם התוסף
  • הגבל התחברות ממכשיר אחד בלבד עם התוסף
  • הפעל אימות דו-שלבי

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

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

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

וחדר הסודות.

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

  • אבטח את השרת
  • הענק הרשאות: 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 ומתיקיית ההעלאות.

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

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

REST API בווקומרס

וזכויות היוצרים.

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

add_action( 'wpcf7_posted_data', 'condless_create_remote_user' );
function condless_create_remote_user( $posted_data ) {
	$api_response = wp_remote_post( 'https://example.com/wp-json/wp/v2/users/', [
		'headers' => [ 'Authorization' => 'Basic ' . base64_encode( 'LOGIN:PASSWORD' ) ],
		'body' => [
			'username'	=> $posted_data['your-name'],
			'email' 	=> $posted_data['your-email'],
			'password'	=> $posted_data['your-password'],
		]
	] );
	$body = json_decode( $api_response['body'] );
	if ( 'OK' === wp_remote_retrieve_response_message( $api_response ) ) {
		// Do something with $body
	}
}

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

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

הרשאות עריכת מוצר בווקומרס

והמתמטיקאי הפרסי.

הסרת האפשרות לערוך שדות מסוימים לבעל תפקיד מסוים (עדכן את השדות ואת בעל התפקיד):

if ( ! current_user_can( 'manage_options' ) ) {
	add_action( 'init', 'condless_remove_features' );
	add_action( 'add_meta_boxes_product', 'condless_remove_metaboxes_edit_product', 9999 );
	add_filter( 'woocommerce_product_data_tabs', 'condless_remove_tabs' );
}

function condless_remove_features() {
	remove_post_type_support( 'product', 'editor' );
}

function condless_remove_metaboxes_edit_product() {
	remove_meta_box( 'postexcerpt', 'product', 'normal' );
	remove_meta_box( 'postimagediv', 'product', 'side' );
	remove_meta_box( 'woocommerce-product-images', 'product', 'side' );
}

function condless_remove_tabs( $tabs ) {
	unset( $tabs['advanced'] );
	return( $tabs );
}

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

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

ערים באזורי משלוח לווקומרס

אילו שימושים בעלי חנויות עושים עם עיר הלקוח?

  • קביעת מחירי משלוח לפי עיר
  • סטטיסטיקת מכירות לפי עיר (לוח בקרה => ווקומרס => דוחות => מכירות לפי עיר)
  • הצגת מוצרים מסוימים ללקוחות לפי עיר (פילטר לפי קטגוריית עיר)
  • מכירת מוצרים מסוימים לפי עיר (תוסף שמגביל לפי מחוז)
  • משלוח מוצרים מסוימים לפי עיר (שיוך המוצרים לקלאס ללא מחיר בשיטת המשלוח הרלוונטית)
  • החלת מיסים לפי עיר (שימוש בקוד העיר בשדה המחוז שבהגדרות)
  • הפעלת שיטות תשלום / משלוח מסוימות לפי עיר (תוסף להתניית שיטות תשלום / משלוח)
  • הצגת הערים בעמוד תשלום חיצוני (משיכה של המחוזות עם ווקומרס REST API)
אפשרויות

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

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

כלי הבחירה הקבוצתית

מהו הפורמט הנדרש?
נקודה פסיק (;) בין עיר לעיר. לדוגמא: אשדוד; חיפה; הרצליה

איך להפוך ערים ברשימה לפורמט הנדרש?
החלף את +[\r\n] (ביטוי רגולרי, סימן הפלוס בקצה הימני) עם ; בעזרת ++Notepad.

איך להזין באזור משלוח את כל המיקומים שמוגדר להם מרחק מסוים מעיר עם רשימת מרחקים?
הזן סימן קריאה (!) ומיד לאחריו את קוד העיר, במידת הצורך הוסף מרחק מינימלי ומקסימלי מופרדים בנקודה פסיק (;). לדוגמא לכל הערים הרחוקות עד 50 ק"מ מחיפה: IL4000; 0; 50! (סימן הקריאה בקצה השמאלי).

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

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

אזורי שילוח חריגים של שירות השליחויות צ'יטה:

אבו בסמה;אבו גווייעד;אבו כף;אבו סנאן;אבו סריחאן;אבו סריחאן (שבט);אבו עבדון;אבו עבדון (שבט);אבו עמאר;אבו עמאר (שבט);אבו עמרה;אבו עמרה (שבט);אבו קוידר;אבו קורינאת;אבו קורינאת (שבט);אבו קרינאת;אבו קרינאת (ישוב);אבו קרינאת (שבט);אבו רביע;אבו רובייעה;אבו רובייעה (שבט);אבו רוקייק;אבו רוקייק (שבט);אבו רקייק;אבו רקיק;אבו תלול;אבטין;אבטליון;אבטן;אביבים;אביגייל;אביגיל;אביטל;אבים;אבירים;אבירם;אבן מנחם;אבן שמואל;אבני איתן;אבני חפץ;אבנת;אבשלום;אגור;אגמון החולה;אדורה;אדירים;אדם;אדמית;אודם;אוהד;אום אל-גנם;אום אל-פחם;אום אל-קוטוף;אום אלגנם;אום בטין;אומן;אומץ;אור הגנוז;אור הנר;אורטל;אורים;אורנים;אורנית;אחוזם;אחוזת ברכפלד;אחזם;אחיה;אטרש;אטרש (שבט);איבטין;איבים;איכסאל;אילון;אילות;אילת;איתמר;איתן;אכסאל;אל-עזאזמה;אל-עריאן;אל-רום;אל סייד;אל עריאן;אל רום;אלהואשלה;אלומה;אלון;אלון מורה;אלון שבות;אלוני אבא;אלוני הבשן;אלונים;אלי-עד;אלי סיני;אלי עד;אלי על;אליאב;אליעד;אליפז;אלמגור;אלמה;אלמוג;אלעזר;אלפי מנשה;אלקוש;אלקנה;אם אל-גנם;אם אל קטוף;אמונים;אמירים;אמן;אמנון;אמץ;אמציה;אניעם;אסד;אסד (שבט);אספר;אעבלין;אפיק;אפרת;אפרתה;ארגמן;ארז;אריאל;ארנית;אש הקודש;אשבול;אשחר;אשכולות;אשל הנשיא;אשלים;אתגר;באקה-גת;באקה אל-גרביה;באר אורה;באר גנים;באר מילכא;באר מילכה;באר מלכה;בארותיים;בארותים;בארי;בבולות;בועיינה;בועיינה-נוגידאת;בוקעאתא;בחן;ביכוריה;ביר אל-מכסור;ביר הדאג;ביר מכסור;ביריה;בית אל;בית אריה;בית גן;בית גוברין;בית הגדי;בית הדר;בית הלוי;בית הערבה;בית חגי;בית חורון;ושוע תעשיה;בית יוסף;בית יתיר;בית לחם;בית לחם בגליל;בית לחם הגלילית;בית ליד;בית ניר;בית עזרא;בית קמה;בית קשת;בית שקמה;ביתר עלית;בני דקלים;בני דרום;בני יהודה;בני נצרים;בני עצמון;מחנה הילה;מחנה מרים;מחנה טלי;מחנה תל נוף;מחנה יפה;מחנה יהודית;מחנה יתיר;מחנה יוכבד;בסמה;בעינה;בעינה נגידאת;בענה;בקעות;בקעת הסיירים;בקעתה;בר יוחאי;ברוכין;ברור חיל;ברוש;ברכה;ברכיה;ברכפלד;ברעם;ברק;ברקן;בת הדר;בת חפר;בת עין;גדידה;גדיידה-מכר;גוליס;גולס;גלגוליה;גנאביב (שבט);גסר א-זרקא;גש (גוש חלב);גת;גדיידה-מכר;גולס;גלגוליה;גנאביב;גאיה;גב ישעיהו;גבולות;גבים;גבע;גבע בנימין;גבעולים;גבעות;גבעות בר;גבעת אהוד;גבעת בר;גבעת הראל;גבעת וש;גבעת זאב;גבעת יואב;גבעת יערים;גבעת ישעיהו;גבעת נילי;גבעת עוז;גבעת עז;גבעת עזר;גבעתי;גברעם;גדות;גדיד;גדיידה;גדיש;גדעונה;גולס;גונן;גורן;גוש חלב;גיאה;גילת;גינות שומרון;גיתה;גיתית;גלאון;גלגוליה;גלגוליה;גלגל;גלעד קבוץ;גן הדרום;גן יאשיה;גן נר;גנאביב;גני מודיעין;גנים;גרופית;גרן;גשור;גשר;גת (באקה במשולש);גת (קיבוץ);גתה;גתית;דבורה;דבוריה;דביר;דבירה;דהילה;דובב;דוחן;דולב;דורות;דחי;דחן;דייר אל-אסד;דייר אל-אסד דיר חנא;דייר חנא;דייר ראפאת;דיר אל-אסד;דיר חנא;דיר ראפאת;דישון;דלב;דלתון;דמיידה;דן;דן גליל עליון;דפנה;דקל;דריגאת;הגושרים;הואשלה;הודיה;הוואשלה;הוואשלה (שבט);הוזייל;הוזייל (שבט);הוזייל שבט;הוזיל;הזורע;הזיל;היוגב;הילה;המעפיל;הר גילה;הר חלוץ;הר עמשא;הרדוף;השומרוני הטוב;ורד יריחו;ורדון;זבארגה;זבארגה (שבט);זבדיאל;זהר;זוהר;זוהרים;זימרת;זיקים;זלפה;זמר;זמרת;זרועה;זרזיר;זרחיה;חואלד;חואלד (שבט);חואלד;חבר;חברון;חגאגרה;חגור;חד-נס;חואלד;חוגייראת (דהרה);חוואלד;חוות גלעד;חוות יזרעם;חולית;חומש;חוסניה;חורה;חורפיש;חורשים;חזון יחזקאל;חיננית;חיספין;חירן;חלמיש;חלף;חלץ;חמאם;חמדיה;חמדת;חמדת (נחל);חמרה;חמש;חמת גדר;חניתה;חננית;חנתון;חספין;חפץ חיים;חצבה;חצרים;חריש;חריש-קציר;חרמש;חרפיש;חשמונאים;טובא-זנגריה;טורעאן;טייבה;טירה;טירת צבי;טל אור;טל מנשה;טללים;טלמון;טמרה;טמרה (יזראל);טנא;טנא עומרים;טרעאן;יאנוח-גת;יבול;יבולה;יד חנה;יד מרדכי;יד נתן;יהל;יובל;יודפת;יוטבתה;יונתן;יושיביה;יזרעאל;יזרעם;יטבתה;ייטב;יכיני;יסיף;יעד;יעל;יעלון;יערה;יפיע;יפית;יפתח;יצהר;יקיר;יראון;ירדנה;ירוחם;ירחיב;ירכא;ישע;יתד;יתיר;כאבול;כאוכב אבו אל-היגא;עוברה;כבול;כדיתה;כוכב;כוכב השחר;כוכב יעקב;כוכב מיכאל;כורזים;כיסופים;כיסרא;כמאנה;כמהין;כנף;כסופים;כסיפה;כסרא;כסרא-סמיע;כעביה-טבאש-חגאגרה;כפאר קאסם;כפר אדומים;כפר אוריה;כפר אורנים;כפר איכסאל;כפר אל עוברה;כפר אלדד;כפר בלום;כפר ברא;כפר גדיידה;כפר גלעדי;כפר דרום;כפר האורנים;כפר הנשיא;כפר זוהרים;כפר זלפה;כפר זמיר;כפר חושן;כפר חרוב;כפר חשן;כפר יאסיף;כפר יובל;כפר יחזקאל;כפר יסיף;כפר יעבץ;כפר יפיע;כפר כסרא;כפר מימון;כפר מרר;כפר נחום;כפר סאלד;כפר סולד;כפר סילבר;כפר סמיע;כפר עזה;כפר עציון;כפר פסוטה;כפר קאסם;כפר קרע;כפר רופין;כפר רות;כפר ריינה;כפר שמאי;כפר תפוח;כפרכפר ברא;כרכום;כרכם;כרם בן זמ;כרם בן זמרה;כרם עמי;כרם שלום;כרמי צור;כרמי קטיף;כרמיה;כרמים;כרמית;כרמל;לבנים;להב;להבות הבשן;להבות חביבה;להבים;לוזית;לוטן;ליבנה;לכיש;לפיד;לקיה;לשם;מ אדומים;מאור;מבוא ביתר;מבוא דותן;מבוא חורון;מבוא חמה;מבואות הגלבוע;מבואות החרמון;מבואות ים;מבואות יריחו;מבועים;מבטחים;מבקיעים;מגד אל-כרום;מגדל שמס;מגאר;מגדו;מגדל עוז;מגדלים;מגידו;מגל;מגן;מגן שאול;מדרך עוז;מדרך עז;מדרשת בן גוריון;מודיעין עילית;מולדה;מולדת;מוסמוס;מועאוויה;אשכול;מרום הגליל;מוקייבלה;מורשת;ניר עקיבא;מושייפרה;מחולה;מחנה בלדד;מחנה חצרים;מחנה נבטים;מחנה סיירים;מחנה עדי;מחנה רמון;מחנה שטים;מטולה;מי עמי;מיגרון;מיטב;מייסר;מיסר;מיצד;מיצר;מירב;מירון;מישור חמד;מישור רותם;מיתר;מיתרים;מכבדא;מכורה;מכחול;מכמורת;מכמרת;מכר;מכרות תמנע;מכתש רמון;מלאה;מלון גלילון;מלילות;מלכיה;מלכישוע;מנוחה;מנוף;מנורה;מנות;מנרה;מנשית זבדה;מסד;מסוף אלנבי;מסילות;מסלות;מסעדה;מסעודין;מסעודין אל-עזאזמה;מע אדומים;מעגלים;מעון;מעיליא;מעיליה;מעין ברוך;מעלה אדומים;מעלה אדמים;מעלה אפרים;מעלה גלבוע;מעלה גלבע;מעלה גמלא;מעלה חבר;מעלה לבונה;מעלה מכמש;מעלה עמוס;מעלה שומרון;מעליא;מעפיל;מפגש הבקעה;מפלסים;מצד;מצדה;מצדות יהודה;מצפה אביב;מצפה אילן;מצפה יריחו;מצפה עדי;מצפה רמון;מצפה שלם;מצר;מרגליות;מרום גולן;מרום הגליל;מרחב עם;מרחבים;מרכז אבשלום;מרכז שפירא;משאבי שדה;משגב;משגב עם;משואה;משואות יצחק;משכיות;משמר הנגב;משמר העמק;משען;מתחם קניאל;מתן;מתקן חולות;מתת;מתתיהו;נאות גולן;נאות הכיכר;נאות הככר;נאות סמדר;נאעורה;נבטים;נבי מוסא;נגידאת;נגבה;נגה;נגוהות;נהורה;נוב;נוגה;נוה;נוה אבות;נוה אור;נוה אטיב;נוה דניאל;נוה זהר;נוה זיו;נוה חלוקים;נוה חריף;נוה מיכאל;נווה;נווה אבות;נווה אור;נווה אטיב;נווה אטיב;נווה דניאל;נווה הרצוג;נווה זוהר;נווה זיו;נווה חריף;נווה מדבר;נווה מיכאל;נווה מנחם;נווה צוף;נועם;נופי נחמיה;נופי פרת;נופים;נוקדים;נורית;נחל אבנת;נחל אלישע;נחל חמדת;נחל נמרוד;נחל עוז;נחל קלע;נחל רותם;נחל רתם;נחל שטים;נחל שיטים;נחל אבנת;נחל אשכולות;נחל חמדת;נחל יתיר;נחל משכיות;נחל נגוהות;נחל נצרים;נחל עוז;נחל עז;נחל צין;נחל קלע;נחל רתם;נחל שטים;נחל שמעה;נחלה;נחליאל;נחניאל;נטועה;נטור;נטע;נטע מרשם;נילי;ניסנית;ניצן;ניצן ב;ניצנה;ניצנה (קהילת חינו;ניצני סיני;ניצני עוז;ניצני שלום;ניצנים;ניר בנים;ניר גלים;ניר דוד-תל עמל;ניר חן;ניר יפה;ניר יצחק;ניר ישראל;ניר משה;ניר עוז;ניר עז;ניר עם;ניר עקיבא;נירים;נירית;נירן;נמרוד;נס הרים;נעלה;נעם;נעמה;נעמי;נערן;נצאצרה;נצאצרה (שבט);נצן;נצנה (קהילת חנוך);נצני סיני;נצני עז;נצנים;נצנים (כפר הנוער);נצר חזני;נצרים;נר יצחק;נריה;נתיב הגדוד;נתיב העשרה;סאגור;סאלם;סאסא;סגולה;סגור;סדום;סואעד-חמרייה;סואעד-כמאנה;סואעד (חמרייה);סואעד כמאנה;סואעד כמאנה (שבט);סואעד שויכי חמריה;סואעד(כמאנה);סוואעד (חמרייה);סוואעד חמיירה;סוסיה;סופה;סחנין;סלמה;סלעית;סמיע;סמר;סנדלה;סנסנה;סעד;סעוה;סער;ספיר;ספסופה;עגר;עגר;עארה;עבדון;עגר;עגר;עדי;עדיעד;עדן;עובדה;עוזה;עוזייר;עולש;עומר;עופרה;עופרים;עוצם;עוקבי;עוקבי (בנו עוקבה);עזוז;עזר;עזריאל;עזריקם;עטאוונה;עטאוונה (שבט);עטאונה;עטרות;עטרות את;עטרת;עידן;עיילבון;עיין השלושה;עיין זיוון;עיין חרוד (איחוד);עילבון;עילוט;עין איברהים;עין אל-אסד;עין בוקק;עין גב;עין גדי;עין הבשור;עין הנציב;עין השלושה;עין זיוון;עין זיון;עין חמד;עין חצבה;עין חרוד (איחוד);עין חרוד (מאוחד);עין יהב;עין כמונים;עין מאהל;עין סהלה;עין עירון;עין צורים;עין קנייא;עין שריד;עין תמר;עינב;עיר אובות;עיר הבהדים;עכברה;עלוט;עלומים;עלי;עלי זהב;עלמה;עלמון;עלש;עמונה;עמיחי;עמיעוז;עמיעז;עמיקם;עמנואל;עמר;ענב;ענתות;עספיא;עפרה;עץ אפרים;עצם;עצמון;עצמון שגב;עראבה;עראמשה;ערד;ערערה;ערערה-בנגב;עשהאל;עתניאל;פארן;פדואל;פני חבר;פני קדם;פסגות;פסוטה;פעמי תשז;פצאיל;פצאל;פרוד;פרזון;פרי גן;צאלים;צבעון;צהר;צוחר;צופים;צופין;צופית;צופר;צוקים;צור הדסה;צור משה;צנדלה;צנדלהן;צריפין;קבועה;קבועה (שבט);קדומים;קדייראת א-צאנע;קדיתא;קדם;קדמת צבי;קדר;קדרים;קדש ברנע;קואעין;קודיראת א-צאנע;קוואעין;קוואעין (שבט);קומראן;קורנית;קטורה;קטיף;קיבוץ אילון;קיבוץ אלון;קיבוץ בית קשת;קיבוץ גת;קיבוץ חניתה;קיבוץ יהל;קיבוץ עין צורים;קידה;קלחים;קליה;קליה;קלנסווה;קלע;קסר א-סיר;קציעות;קציר-חריש;קצר א-סר;קצרין;קריית ארבע;קריית ספר;קרית ארבע;קרית נטפים;קרית ספר;קרני שומרון;קרע;קרע (כפר);קשת;ראס אל-עין;ראס עלי;ראש צורים;רבבה;רביבים;רגבים;רהט;רווחה;רוויה;רוחה;רוחמה;רויה;רומאנה;רומת הייב;רועי;רותם;רותם (נחל);רחוב;רחלים;ריחאניה;ריחן;ריחניה;ריינה;רימונים;רינה;רם-און;רם און;רמונים;רמות;רמות נפתלי;רמת חובב;רמת מגישימים;רמת מגשימים;רמת נגב;רמת צבי;רעים;רפיח ים;רקפת;רשפ לא לשימוש;רשפים;רתמים;שא-נור;שאר ישוב;שבות רחל;שבטה;שבי דרום;שבי שומרון;שבלי;שבלי - אום אל-גנם;שבלי אום אל גנם;שבלים;שגב-שלום;שגב שלום;שגב/עצמון;שגור;שדה אליהו;שדה בוקר;שדה דוד;שדה יואב;שדה יצחק;שדה ניצן;שדה נצן;שדה עוזיהו;שדה עזיהו;שדה צבי;שדות נגב;שדי אברהם;שדי חמד;שדי תרומות;שדמות מחולה;שובה;שובל;שומרה;שומריה;שוקדה;שזפון;שחר;שחרות;שיבולים;שיבטה;שיבלי;שיזף;שיזפון;שיח דנון;שיטים;שייח דנון;שילה;שכניה;שלווה;שלווה במדבר;שלוחות;שלומית- דרום;שלפים;שמיר;שמעה;שמעה (נחל);שמרת;שני;שניר;שעב;שעל;שער אפרים;שער בנימין;שער הנגב;שער מנשה;שערי תקוה;שערי תקווה;שפיר;שפר;שפרעם;שקד;שקף;שרשרת;שתולה;שתולים;תאשור;תדהר;תומר;תושיה;תל חי;תל עמל;תל ערד;תל קציר;תל שבע;תל תאומים;תלם;תלמי אליהו;תלמי בילו;תלמי בילו;תלמי יוסף;תלמי יפה;תלמים;תמנע;תמר {מעצ};תמרה;תקומה;תקוע;תראבין א-צאנע;תראבין א-צאנע יישוב
אינטגרציות

מדוע במערכת צד ג' שהטמעתי באתר שם העיר מופיע פעמיים או שמופיע קוד העיר?
יהיה עליך להסיר את ההעברה של שדה המחוז (חיוב/משלוח, הזמנות/לקוחות) למדינות שהחלת עליהן את התוסף בקוד של התוסף של המערכת המוטמעת.

מדוע במערכות צד ג' שהטמעתי באתר שדה העיר ריק או שהסליקה נכשלת?
יהיה עליך לשנות את הדרך בה המערכת מושכת את שדה העיר (חיוב/משלוח) למדינות עליהן החלת את התוסף, מ-$_POST['billing_city'] ל-$order->get_billing_city(). לחלופין, הוסף לאקשן woocommerce_checkout_create_order פעולה שמעתיקה את $order->get_billing_city() אל $_POST['billing_city'].

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

רשימת ערים

איך לשנות שמות של ערים?
עדכן את קודי המדינות, וקודי ושמות הערים:
* אין להשתמש במידה ואפשרות הפילטרים מופעלת

add_filter( 'csz_cities', 'csz_modify_cities' );
function csz_modify_ities( $states ) {
	$states['AT']['AT90001'] = 'Vienna';
	return $states;
}

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

add_filter( 'csz_cities', 'csz_remove_cities' );
function csz_remove_cities( $states ) {
	$country_code = 'AT';
	$unnecessary_cities = [ 'AT10101', 'AT10201', 'AT10301' ];
	foreach ( $unnecessary_cities as $city ) {
		unset( $states[ $country_code ][ $city ] );
	}
	return $states;
}

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

add_filter( 'csz_cities', 'csz_set_cities' );
function csz_set_cities( $states ) {
	$country = 'AT';
	$cities = [ 'AT10101', 'AT10201', 'AT10301' ];
	$new_states = [];
	foreach ( $cities as $city ) {
		if ( isset( $states[ $country ][ $city ] ) ) {
			$new_states[ $city ] = $states[ $country ][ $city ];
		}
	}
	$states[ $country ] = $new_states;
	return $states;
}

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

add_filter( 'csz_states', 'csz_remove_states_cities' );
function csz_remove_states_cities( $states ) {
	$unnecessary_states = [ 'EE001', 'EE004', 'EE006' ];
	foreach ( $unnecessary_states as $state_code ) {
		if ( isset( $states[ $state_code ] ) ) {
			unset( $states[ $state_code ] );
		}
	}
	return $states;
}

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

add_filter( 'csz_cities', 'csz_split_cities' );
function csz_split_cities( $states ) {
	$country_code = 'AT';
	$city_code = 'AT90001';
	$sub_cities = [ __( 'Northern', 'woocommerce' ), __( 'Southern', 'woocommerce' ) ];
	$count = 101;
	foreach ( $sub_cities as $sub_city ) {
		$states[ $country_code ][ $city_code . $count ] = $states[ $country_code ][ $city_code ] . ' - ' . $sub_city;
		$count++;
	}
	unset( $states[ $country_code ][ $city_code ] );
	return $states;
}
עמלת מרחק

איך ניתן להחיל עמלת מרחק?
בהינתן רשימה (תוך-ארצית) של מרחקים מעיר, יתאפשר להוסיף עמלה מבוססת מרחק למחיר משלוח או למחיר מוצר (למשל בכדי למכור שירותי הובלות).

האם בתוסף ישנן רשימות מרחקים מובנות?
לישראל מספר ערים עם רשימת מרחקים מובנית בעברית.

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

היכן תופיע עמלת המרחק שהוגדרה למוצר?
העמלה תתווסף למחירו ותופיע בסכום הביניים שבווידג'ט עגלת הקניות.

איך עלי לארגן רשימת מרחקים לעיר?
השתמש כאינדקס בקודים של המיקומים או בשמות שלהם (כפי שמופיעים בלוח הבקרה ועדכן את key_format$), ודא שמוגדר מרחק גם לעיר עצמה, על המרחקים להיות גדולים מ-0.

שורטקודים

איך להציג רשימה של ערים בעזרת שורטקוד?
השתמש בשורטקוד [csz_form]:

add_shortcode( 'csz_field', 'wp_csz_field_shortcode' );
function wp_csz_field_shortcode( $atts ) {
	$atts = shortcode_atts( [
		'key'	=> 'shipping_state',
		'type'	=> 'state',
		'required'	=> '1',
		'country' => WC()->countries->get_base_country(),
		'description'	=> '',
		'class' => [ 'form-row', 'address-field', 'form-row-first' ],
		'label'	=> __( 'City', 'woocommerce' ),
		'value'	=> '',
	], $atts, 'csz_field' );
	$output = woocommerce_form_field( $atts['key'], [
		'type'	=> $atts['type'],
		'label'	=> $atts['label'],
		'class'	=> $atts['class'],
		'required'	=> $atts['required'],
		'description'	=> $atts['description'],
		'country'	=> $atts['country']
		], $atts['value'] );
	if ( 'country' === $atts['type'] || 'state' === $atts['type'] ) {
		wp_enqueue_script( 'selectWoo' );
		wp_enqueue_style( 'select2' );
		wp_enqueue_script( 'wc-country-select' );
	}
	return $output;
}
ווקומרס REST API

השתמש במחלקה:

add_filter( 'woocommerce_rest_api_get_rest_namespaces', 'wc_states_api' );
function wc_states_api( $controllers ) {
	$controllers['wc/v3']['data-states'] = 'WC_REST_Data_States_Controller';
	return $controllers;
}

class WC_REST_Data_States_Controller extends WC_REST_Data_Controller {
	protected $namespace = 'wc/v3';
	protected $rest_base = 'data/states';
	function register_routes() {
		register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<state>[\w-]+)/zone', [
			'methods'		=> 'GET',
			'callback'		=> [ $this, 'get_zone' ],
			'args'			=> [ 'state' => [ 'description' => __( 'State / County', 'woocommerce' ), 'type' => 'string' ] ],
			'permission_callback'	=> [ $this, 'get_items_permissions_check' ],
		] );
		register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<state>[\w-]+)/state', [
			'methods'		=> 'GET',
			'callback'		=> [ $this, 'get_state' ],
			'args'			=> [ 'state' => [ 'description' => __( 'State / County', 'woocommerce' ), 'type' => 'string' ] ],
			'permission_callback'	=> [ $this, 'get_items_permissions_check' ],
		] );
	}
	function get_zone( $data ) {
		return [ 'id' => wc_get_shipping_zone( [ 'destination' => [ 'country' => substr( $data['state'], 0, 2 ), 'state' => $data['state'], 'postcode' => '' ] ] )->get_zone_id() ];
	}
	function get_state( $data ) {
		foreach ( get_option( 'wc_csz_countries_codes' ) as $country_code ) {
			$country_cities = '';
			$country_states = '';
			include( WP_PLUGIN_DIR . '/cities-shipping-zones-for-woocommerce/i18n/cities/' . $country_code . '.php' );
			if ( isset( $country_states ) ) {
				foreach ( $country_states as $state_code => $state_name ) {
					if ( isset( $country_cities[ $state_code ][ $data['state'] ] ) ) {
						return $country_states[ $state_code ];
					}
				}
			}
		}
		return false;
	}
}

איך לקבל את אזור המשלוח אליו עיר כלשהי שייכת?

/wp-json/wc/v3/data/states/<city_code>/zone

איך לקבל את המחוז אליו שייכת עיר כלשהי?

/wp-json/wc/v3/data/states/<city_code>/state
הסרת התוסף / מדינות / מיקומים
  • הגדרות אזורי משלוח בווקומרס: הסר את המיקומים (תוכל להיעזר בכלי העריכה הקבוצתית)
  • הגדרות תוסף: הסר את המדינות
  • הגדרות ווקומרס: עדכן את כתובת החנות
  • משתמשים: המר/מחק את ערכי שדה המחוז במשתמשים שנוצרו/שעודכנו בזמן שהתוסף היה מוחל על המדינות שהם שייכים אליהם
  • תוספים: כבה ומחק את התוסף
קטגוריות
ווקומרס

הגבלת גישה בווקומרס

והנווד.

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

add_action( 'template_redirect', 'condless_redirect' );
function condless_redirect() {
	if ( ! is_user_logged_in() && is_product() && false === strpos( wp_get_referer(), home_url() . '/?s' ) && 0 === wc()->cart->get_cart_contents_count() ) {
		wp_redirect( home_url() );
	}
}

הגבלת שליחה של טופס צור קשר אחד לכל כתובת אימייל- התקן את התוסף, והתוסף ובקוד:

add_filter( 'wpcf7_validate_email*', 'condless_email_validation_filter', 20, 2 );
function condless_email_validation_filter( $result, $tag ) {
	if ( Flamingo_Contact::find( [ 's' => trim( $_POST['your-email'] ) ] ) ) {
		$result->invalidate( $tag, __( 'Sorry, that email address is already used!' ) );
	}
        return $result;
}

שמירת קבצים מצורפים בתיקיה שנגישה רק ליוזרים באתר- התקן את התוסף, והתוסף וצור קובץ htaccess. בתיקייה wpcf7-submissions שבתיקיית ההעלאות עם התוכן:

Options -Indexes
RewriteEngine On
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in.*$ [NC]
RewriteRule ^(.*)$ - [R=403,L]

כפי שבוודאי שמת לב- בשונה מתבניות ברירות המחדל אחרות, התבנית Twenty Twenty לא פותחה מאפס, אלא נבנתה על בסיס התבנית צ'פלין של אנדרס נורן.

קטגוריות
תוספים לוורדפרס

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

איך להחריג משתמש מסוים מחוקים המוחלים על סוג פוסט מסוים?
עדכן את סוג הפוסט וה-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' );
array_push( $role_option, $role );
array_push( $type_option, $type );
array_push( $limit_option, $limit );
array_push( $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( $_GET['listing_type'] ) ) {
		$args['meta_query'] = [
			[
				'key'	=> '_case27_listing_type',
				'value'	=> $_GET['listing_type']
			]
		];
	}
	return $args;
}
קטגוריות
ווקומרס

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

ואמני הג'אז.

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

עדכון הלקוח בווקומרס בעמוד מוצר על פספוס הנחה מכיוון שלא רכש ממנו מספיק פריטים- הוסף את הטריגר 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;
		if ( isset( $product->get_availability()['availability'] ) ) $out = '<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;
}

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

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

יצירה אוטומטית של פוסט בווקומרס

ובחזרה לעתיד.

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

add_action( 'woocommerce_order_status_completed', 'condless_create_page' );
function condless_create_page( $order_id ) {
	foreach ( wc_get_order( $order_id )->get_items() as $item ) {
		if ( '9' === $item->get_product_id() ) {
			$user_id = wc_get_order( $order_id )->get_user_id();
			$user = new WP_User( $user_id );
			$user->remove_role( 'customer' );
			$user->add_role( 'author' );
			wp_insert_post( [ 'post_title' => 'My New Page', 'post_status' => 'publish', 'post_author' => $user_id, 'post_type' => 'post' ] );
		}
	}
}

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

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

ווקומרס מימין לשמאל

ואבן החכמים.

תיקון הבלוק של קוד בעורך גוטנברג (CSS):

pre.wp-block-code {
	text-align: left;
	direction: ltr;
}

תיקון סליידר מבוסס Owl Carousel בקוד (CSS):

.owl-carousel,
.bx-wrapper { direction: ltr; }
.owl-carousel .owl-item { direction: rtl; }

תיקון תפריט נפתח מבוסס Chosen Drop בקוד (CSS):

.chosen-container .chosen-drop { left: 9999px; }

יצירת תבנית בת לתבנית Twenty Twenty- צור את הנתיב wp-content/themes/twentytwenty-child, ובו את הקבצים style.css ו-style-rtl.css עם התוכן:

/*
 Theme Name:   twentytwenty Child
 Template:     twentytwenty
*/

וקובץ functions.php עם התוכן:

<?php
add_action( 'wp_enqueue_scripts', 'condless_theme_enqueue_styles' );
function condless_theme_enqueue_styles() {
        if ( is_rtl() ) {
                wp_enqueue_style( 'parent-style-rtl', get_template_directory_uri() . '/style-rtl.css' );
        } else {
                wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
        }
}

תיקון תצוגת הפונטים (CSS):


body {
	font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif;
}

יצירת תבנית בת לתבנית Storefront- צור את הנתיב wp-content/themes/storefront-chlid, ובו את הקבצים style.css ו-style-rtl.css עם התוכן:

/*
Theme Name: Storefront Child
Template: storefront
*/

והקובץ functions.php עם התוכן:

<?php
add_action( 'wp_enqueue_scripts', 'condless_theme_enqueue_styles', 9999 );
function condless_theme_enqueue_styles() {
	if ( is_rtl() ) {
        	wp_dequeue_style( 'storefront-child-style' );
		wp_enqueue_style( 'child-style-rtl', get_stylesheet_directory_uri() . '/style-rtl.css', 'storefront-style' );
	}
}

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