ארכיונים: Snippets | עמוד 14

הסרת שדה URL / Website מהתגובות בוורדפרס

התגובות בוורדפרס מגיעות כברירת מחדל עם שדה בשם ״אתר״ (באנגלית שמו Website או URL) בדרך כלל. אם אתם מעוניינים להסיר שדה זה, בין אם לצורך עיצובי ובין אם פשוט להסיר עוד שדה אשר בד״כ אינו הכרחי ונחוץ, השתמשו בסניפט הבא (functions.php):

function savvy_disable_comment_url($fields) {
    unset($fields['url']);
    return $fields;
}
add_filter('comment_form_default_fields','savvy_disable_comment_url');

קוד זה משתמש בפילטר של וורדפרס. למידע נוסף בהבנת הוקים בוורדפרס.

הוספת משתמש חדש דרך functions.php

אם ננעלתם מחוץ ל-wp-admin, הגישה היחידה שלכם היא דרך FTP או מנהל הקבצים, ואין לכם אפשרות לאפס את הסיסמה דרך phpMyAdmin, תוכלו להוסיף משתמש מנהל דרך הקובץ functions.php בכמה שורות PHP.

הסניפט מראה גם כיצד username_exists(), email_exists(), wp_create_user() ו-WP_User::set_role() פועלות יחד כשאתם יוצרים משתמש בוורדפרס באמצעות קוד.

אזהרת אבטחה: השתמשו פעם אחת ומחקו

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

  • הסירו את הקוד מיד אחרי שהתחברתם פעם אחת.
  • השתמשו בסיסמה ארוכה וייחודית, ואחרי ההתחברות החליפו אותה שוב דרך משתמשים > פרופיל.
  • לעולם אל תעשו commit לקוד הזה ל-Git ואל תשאירו אותו בסביבת staging או בגיבוי של האתר.
  • אם מצאתם סניפט כזה באתר ואתם לא הוספתם אותו, התייחסו אליו כאל אתר פרוץ. קוד מוזרק שיוצר חשבונות מנהל הוא backdoor נפוץ (ראו כיצד לתקן אתר וורדפרס פרוץ).

הוספת משתמש מנהל דרך functions.php

הוסיפו את הקוד הבא לקובץ functions.php של התבנית הפעילה. אם התבנית שבורה או שאינכם בטוחים איזו תבנית פעילה, שמרו אותו כקובץ PHP (שמתחיל ב-<?php) בתיקייה wp-content/mu-plugins/, כי תוספי must-use נטענים ללא קשר לתבנית.

function sv_wp_admin_account() {
	$user  = 'Username';
	$pass  = 'Password';
	$email = '[email protected]';

	if ( ! username_exists( $user ) && ! email_exists( $email ) ) {
		$user_id = wp_create_user( $user, $pass, $email );

		if ( ! is_wp_error( $user_id ) ) {
			$user = new WP_User( $user_id );
			$user->set_role( 'administrator' );
		}
	}
}
add_action( 'init', 'sv_wp_admin_account' );

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

כיצד זה עובד

ההוק init מופעל בכל בקשה, כך שהחשבון נוצר בטעינת העמוד הראשונה לאחר שמירת הקובץ. הבדיקות מונעות הרצה כפולה של הקוד.

  • username_exists( $username ) מחזירה את מזהה המשתמש אם שם המשתמש תפוס, או false.
  • email_exists( $email ) עושה את אותו הדבר עבור כתובת האימייל.
  • wp_create_user( $username, $password, $email ) יוצרת את המשתמש עם תפקיד ברירת המחדל של האתר ומבצעת hash לסיסמה. היא מחזירה את מזהה המשתמש החדש, או WP_Error במקרה של כישלון.
  • new WP_User( $user_id ) טוען את המשתמש, ו-set_role( 'administrator' ) מסירה את כל התפקידים הקיימים שלו ומקצה לו את התפקיד החדש.

הבדיקה is_wp_error() חשובה: ללא הבדיקה הזו, אם יצירת המשתמש תיכשל, WP_User יקבל אובייקט שגיאה במקום מזהה משתמש.

חלופה בטוחה יותר: WP-CLI

אם יש לכם גישת SSH, וותרו לגמרי על עריכת הקבצים. פקודה אחת יוצרת את משתמש המנהל, ושום דבר לא נשמר על הדיסק:

wp user create newadmin [email protected] --role=administrator

אם תשמיטו את --user_pass, WP-CLI ייצור סיסמה אקראית ויציג אותה פעם אחת בלבד. עיינו בתיעוד של wp user create לכל האפשרויות, או במדריך ל-WP-CLI אם עדיין לא השתמשתם בו.

יצירת משתמש עם כל תפקיד בקריאה אחת

בתוספים ובייבוא משתמשים, wp_insert_user() מקבלת את התפקיד ישירות, כך שאין צורך בשלב נפרד של set_role():

$user_id = wp_insert_user( array(
	'user_login' => 'editor1',
	'user_email' => '[email protected]',
	'user_pass'  => wp_generate_password( 24 ),
	'role'       => 'editor',
) );

if ( is_wp_error( $user_id ) ) {
	error_log( $user_id->get_error_message() );
}

תוכלו להשתמש במזהה (slug) של כל תפקיד רשום: administrator, editor, author, contributor, subscriber, או תפקיד מותאם אישית.

שאלות נפוצות

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

למה משתמש המנהל החדש לא נוצר?
בדרך כלל שם המשתמש או האימייל כבר שייכים למשתמש קיים, ולכן הבדיקה מדלגת על היצירה בשקט. ודאו גם שערכתם את functions.php של התבנית הפעילה, או השתמשו ב-mu-plugins בכדי לשלול אפשרות זו.
כיצד הופכים משתמש קיים למנהל באמצעות קוד?
טענו את המשתמש עם get_user_by( 'email', '[email protected]' ) וקראו ל-set_role( 'administrator' ) על התוצאה. אם יש לכם גישת SSH, הפקודה wp user set-role עושה את אותו הדבר בלי לגעת בקבצים.
האם בטוח להשאיר את הקוד ב-functions.php?
לא. כל מי שיכול לקרוא את הקובץ (או גיבוי שלו) מקבל סיסמת מנהל, והחשבון חוזר גם אם מישהו מוחק אותו. הסירו את הקוד מיד אחרי שהתחברתם.
האם הקוד יוצר Super Admin ב-Multisite?
לא. set_role( 'administrator' ) הופכת את המשתמש למנהל של האתר הנוכחי בלבד. גישה ברמת הרשת כולה דורשת את grant_super_admin( $user_id ).

בדיקה האם קיים Gravatar עבור משתמש לפי אימייל או ID

הפונקציה הבאה יבדוק האם קיים גראבאטר (Gravatar) עבור אימייל או ID של משתמש כלשהו בוורדפרס ותחזיר משתנה בוליאני (boolean). הוסיפו קוד זה לקובץ functions.php בתבנית שלכם:

/**
 * Utility function to check if a gravatar exists for a given email or id
 * @param int|string|object $id_or_email A user ID,  email address, or comment object
 * @return bool if the gravatar exists or not
 */

function validate_gravatar($id_or_email) {
	//id or email code borrowed from wp-includes/pluggable.php
	$email = '';
	if ( is_numeric($id_or_email) ) {
		$id = (int) $id_or_email;
		$user = get_userdata($id);
		if ( $user )
			$email = $user->user_email;
	} elseif ( is_object($id_or_email) ) {
		// No avatar for pingbacks or trackbacks
		$allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) );
		if ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) )
			return false;

		if ( !empty($id_or_email->user_id) ) {
			$id = (int) $id_or_email->user_id;
			$user = get_userdata($id);
			if ( $user)
				$email = $user->user_email;
		} elseif ( !empty($id_or_email->comment_author_email) ) {
			$email = $id_or_email->comment_author_email;
		}
	} else {
		$email = $id_or_email;
	}

	$hashkey = md5(strtolower(trim($email)));
	$uri = 'http://www.gravatar.com/avatar/' . $hashkey . '?d=404';

	$data = wp_cache_get($hashkey);
	if (false === $data) {
		$response = wp_remote_head($uri);
		if( is_wp_error($response) ) {
			$data = 'not200';
		} else {
			$data = $response['response']['code'];
		}
		wp_cache_set($hashkey, $data, $group = 'has_gravatar', $expire = 60*5);

	}
	if ($data == '200'){
		return true;
	} else {
		return false;
	}
}

השימוש בפונקציה מתבצע בצורה הבאה:

$author_id = get_the_author_meta( 'ID' );

if (validate_gravatar($author_id)) {...}
	

לעוד טיפים לוורדפרס, תנו מבט במה זה וורדפרס?.

שליחת אימייל כשמפורסם פוסט חדש באתר וורדפרס

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

add_action('future_to_publish', 'send_emails_on_new_event');
add_action('new_to_publish', 'send_emails_on_new_event');
add_action('draft_to_publish' ,'send_emails_on_new_event');
add_action('auto-draft_to_publish' ,'send_emails_on_new_event');
 
 
/**
 * Send emails on event publication
 *
 * @param WP_Post $post
 */
function send_emails_on_new_event($post)
{
    $emails = "[email protected], [email protected]"; //If you want to send to site administrator, use $emails = get_option('admin_email');
    $title = wp_strip_all_tags(get_the_title($post->ID));
    $url = get_permalink($post->ID);
    $message = "Link to post: \n{$url}";
 
    wp_mail($emails, "New post published: {$title}", $message);
}

התוצאה תהיה משהו בסגנון הבא:

[Title] New post published: Your Post
    
Link to post:
http://site.co.il/your-post/

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

...
if(get_post_type($post->ID) === 'page') //post, page, attachment or whatever other CPT you may have
{
    //use wp_mail() here!
}
...

הפנייה לדף הבית לאחר ניתוק מהמערכת

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

add_action('wp_logout', function()
{
    wp_redirect(get_home_url());
    exit;
});

לעוד על הפניות ו-SEO, תנו מבט בהפניות 301 והחשיבות שלהן ב-SEO.

הוספת User Role ל Body Class בממשק הניהול

הנה דרך להוספת Class לפי תפקיד המשתמש בממשק הניהול של וורדפרס. הוסיפו את הקוד הבא לקובץ functions.php בתבנית שלכם:

add_filter('admin_body_class', function($classes) {
    global $current_user;
 
    if(is_array($current_user->roles)) {
        foreach($current_user->roles as $role) {
            $classes .= "user-role-{$role} ";
        }
    }
 
    return rtrim($classes);
});

התוצאה תהיה משהו בסגנון של:

<body class="... user-role-administrator ...">

קוד זה משתמש בפילטר body_class. למידע נוסף בהבנת הוקים בוורדפרס.

שינוי סדר התפריט בלוח הבקרה של וורדפרס

סניפט קצר שמאפשר לשנות את הסדר של התפריט בלוח הבקרה של וורדפרס. פשוט בחרו את הסדר שאתם רוצים במערך $reordered_items. אתם יכולים להשתמש ב var_dump($menu_order) בכדי למצוא את כל הפריטים בתפריט.

הפריטים יופיע תחת הפריט העליון ביותר (לוח הבקרה / Dashboard).

add_filter('menu_order', 'reorder_admin_menu', 999);
 
/**
 * Reorders admin menu to match the wanted order
 *
 * @param $menu_order
 * @return mixed
 */
function reorder_admin_menu($menu_order) {
 
  //Example. Puts "Pages" above "Posts".
  $reordered_items = array(
    'edit.php?post_type=page',
    'edit.php'
  );
 
  //This is where we will insert our reordered items
  $reordered_items_insertion_point = 'index.php';
 
  //Remove items we are supposed to reorder
  $filtered_menu_order = array_diff($menu_order, $reordered_items);
 
  //Init new order
  $new_menu_order = array();
 
  //Loop all current menu items
  foreach($filtered_menu_order as $menu_item) {
 
    //Add to array
    $new_menu_order[] = $menu_item;
 
    //Our trigger? Let's go!
    if($menu_item === $reordered_items_insertion_point) {
 
      //Add in our reordered items
      $new_menu_order = array_merge($new_menu_order, $reordered_items);
    }
  }
 
  return $new_menu_order;
}

קוד זה משתמש בפילטר של וורדפרס. למידע נוסף בהבנת הוקים בוורדפרס.

הוספת CSS לעורך הויזואלי של Advanced Custom Fields

דוגמה להוספת קובץ CSS מהתבנית שלכם לעורך הויזואלי (WYSIWYG) של התוסף Advanced Custom Fields. הקוד מטה יעבוד גם ב Frontend במידה ואתם משתמשים בפונקציה ()acf_forms.


$content_css = get_stylesheet_directory_uri() . '/your-custom-css.css';
 
  if (isset($mce_init[ 'content_css' ])) {
    $mce_init[ 'content_css' ] = "{$mce_init['content_css']},{$content_css}";
  }
 
  return $mce_init;
});
    
add_filter( 'tiny_mce_before_init', function($mce_init) {

איך להוסיף מדינה חדשה ברשימת המדינות בווקומרס

הסניפט הבא נלקח מהדוקומנטציה של ווקומרס ועושה בדיוק מה שאתם חושבים. הוסיפו סניפט זה לקובץ functions.php בכדי להוסיף מדינה חדשה לרשימת המדינות בווקומרס.

function woo_add_my_country( $country ) {
   $country["AE-DU"] = 'Dubai';
   return $country;
}
add_filter( 'woocommerce_countries', 'woo_add_my_country', 10, 1 );