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

הוספת Bulk Actions מותאמים לרשימת הפוסטים בוורדפרס

הוספת אפשרות מותאמת לתפריט bulk actions ברשימת הפוסטים. בדוגמה זו מסמנים פוסטים נבחרים כ-"Featured". לעוד על הוקים בוורדפרס.

add_filter( 'bulk_actions-edit-post', function ( $actions ) {
    $actions['mark_featured'] = 'Mark as Featured';
    return $actions;
} );

add_filter( 'handle_bulk_actions-edit-post', function ( $redirect_to, $action, $post_ids ) {
    if ( $action !== 'mark_featured' ) {
        return $redirect_to;
    }

    foreach ( $post_ids as $post_id ) {
        update_post_meta( $post_id, '_is_featured', '1' );
    }

    return add_query_arg( 'marked_featured', count( $post_ids ), $redirect_to );
}, 10, 3 );

add_action( 'admin_notices', function () {
    if ( empty( $_REQUEST['marked_featured'] ) ) {
        return;
    }

    $count = intval( $_REQUEST['marked_featured'] );
    printf(
        '<div class="notice notice-success is-dismissible"><p>%d post(s) marked as featured.</p></div>',
        $count
    );
} );

הוסיפו ל-functions.php. שנו את mark_featured ואת מפתח ה-meta בהתאם לצורך שלכם.

יצירת Shortcode פשוט עם Attributes בוורדפרס

יצירת shortcode ניתן לשימוש חוזר עם attributes. זהו הדפוס הבסיסי לכל shortcode מותאם בוורדפרס. לעוד על הוקים בוורדפרס.

function savvy_button_shortcode( $atts ) {
    $atts = shortcode_atts( array(
        'url'   => '#',
        'text'  => 'Click Here',
        'color' => 'blue',
    ), $atts, 'savvy_button' );

    return sprintf(
        '<a href="%s" class="savvy-btn savvy-btn-%s">%s</a>',
        esc_url( $atts['url'] ),
        esc_attr( $atts['color'] ),
        esc_html( $atts['text'] )
    );
}

add_shortcode( 'savvy_button', 'savvy_button_shortcode' );

הוסיפו ל-functions.php. שימוש: [savvy_button url="/contact/" text="Contact Us" color="gold"].

רישום Endpoint מותאם ב-REST API של וורדפרס

רישום endpoint מותאם ב-REST API בכדי לחשוף מידע מהתבנית או מהתוסף שלכם. לעוד על אבטחת REST API.

add_action( 'rest_api_init', function () {
    register_rest_route( 'savvy/v1', '/recent-posts/', array(
        'methods'             => 'GET',
        'callback'            => 'savvy_get_recent_posts',
        'permission_callback' => '__return_true',
    ) );
} );

function savvy_get_recent_posts() {
    $posts = get_posts( array(
        'numberposts' => 5,
        'post_status' => 'publish',
    ) );

    $data = array();
    foreach ( $posts as $post ) {
        $data[] = array(
            'id'    => $post->ID,
            'title' => $post->post_title,
            'link'  => get_permalink( $post ),
        );
    }

    return rest_ensure_response( $data );
}

הוסיפו ל-functions.php. הגישה דרך /wp-json/savvy/v1/recent-posts/. הגדירו permission_callback בכדי להגביל גישה במידת הצורך.

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

כדי להוסיף הודעה בממשק הניהול של וורדפרס, חברו פונקציה להוק admin_notices והדפיסו div עם ה-class בשם notice. זה אותו מנגנון שהליבה והתוספים משתמשים בו להצגת הודעות הצלחה, אזהרות ושגיאות בראש המסכים ב-wp-admin.

השתמשו בו לתזכורות לצוות התוכן שלכם, לאזהרות תצורה בתוסף או לאישור לאחר פעולה מותאמת.

הוספת הודעה מותאמת בממשק הניהול

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

add_action( 'admin_notices', function () {
    $screen = get_current_screen();

    if ( ! $screen || 'edit-post' !== $screen->id ) {
        return;
    }

    echo '<div class="notice notice-warning is-dismissible">';
    echo '<p>' . esc_html__( 'Remember to set a featured image before publishing.', 'your-textdomain' ) . '</p>';
    echo '</div>';
} );

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

איך זה עובד

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

ה-classes קובעים את מראה ההודעה:

  • notice נדרש בכל הודעה.
  • notice-success (ירוק), notice-error (אדום), notice-warning (צהוב) או notice-info (כחול) קובעים את צבע ה-border שבצד ההודעה.
  • is-dismissible מוסיף כפתור סגירה.

get_current_screen() מחזירה את אובייקט המסך הנוכחי. מזהים שימושיים הם dashboard, edit-post (רשימת הפוסטים), post (עורך הפוסטים), upload, plugins ו-options-general.

הפונקציה wp_admin_notice() (וורדפרס 6.4 ומעלה)

החל מוורדפרס 6.4, הפונקציה wp_admin_notice() בונה עבורכם את ה-markup. הנה אותה הודעה מהדוגמה הקודמת, בלי לכתוב HTML ידנית:

add_action( 'admin_notices', function () {
    $screen = get_current_screen();

    if ( ! $screen || 'edit-post' !== $screen->id ) {
        return;
    }

    wp_admin_notice(
        esc_html__( 'Remember to set a featured image before publishing.', 'your-textdomain' ),
        array(
            'type'        => 'warning',
            'dismissible' => true,
        )
    );
} );

הארגומנט type מקבל את הערכים success, error, warning או info ומוסיף את ה-class המתאים עם הקידומת notice-. הארגומנטים הנוספים הם id, additional_classes, attributes ו-paragraph_wrap, שערכו true כברירת מחדל. הפלט עובר דרך wp_kses_post(), כך שקישורים ותגיות <strong> נשמרים, אך סקריפטים לא.

אם התוסף שלכם עדיין תומך בגרסאות מוקדמות מ-6.4, עטפו את הקריאה ב-function_exists( 'wp_admin_notice' ) או השאירו את ה-markup הידני.

למה ההודעה לא מופיעה בעורך הבלוקים

כשעורך הבלוקים פעיל, הוא מסתיר את אזור ההודעות הקלאסי, כך שכל מה שמודפס ב-admin_notices לא מופיע בזמן עריכת פוסט. במקום זאת, השתמשו ב-store של ההודעות ב-JavaScript של העורך:

wp.data.dispatch( 'core/notices' ).createNotice(
    'warning',
    'Remember to set a featured image before publishing.',
    { isDismissible: true }
);

טענו את הסקריפט רק במסכי העורך, כפי שמוסבר בטעינת סקריפטים רק בעמודי ניהול ספציפיים, עם wp-data ו-wp-notices כתלויות. למידע נוסף על actions ופילטרים, ראו את הפוסט הוקים בוורדפרס.

שאלות נפוצות

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

למה ההודעה שסגרתי חוזרת אחרי רענון העמוד?
is-dismissible רק מסיר את ההודעה מהעמוד באמצעות JavaScript. בכדי שתישאר מוסתרת, שמרו את הסגירה בעצמכם (למשל ב-user meta דרך בקשת AJAX) ובדקו את הערך הזה לפני שאתם מדפיסים את ההודעה.
כיצד מציגים הודעת הצלחה אחרי שמירת טופס מותאם?
בצעו הפניה חזרה עם פרמטר בכתובת כמו &saved=1, בדקו אותו בתוך ה-callback של admin_notices והדפיסו notice-success. טפסים של ה-Settings API שנשלחים אל options.php מקבלים הודעת "Settings saved." באופן אוטומטי.
למה ההודעות של add_settings_error() לא מופיעות?
וורדפרס קוראת ל-settings_errors() באופן אוטומטי רק בעמודים שתחת התפריט ״הגדרות״. בעמוד ברמה העליונה (top-level) או בכל עמוד ניהול מותאם אחר, קראו ל-settings_errors() בעצמכם בתחילת הפלט של העמוד.
כיצד מציגים הודעה ב-Network Admin באתר Multisite?
מסכי ה-Network Admin מפעילים את network_admin_notices במקום admin_notices. השתמשו ב-all_admin_notices אם ההודעה צריכה להופיע בשניהם.

תזמון Cron לניקוי Transients שפג תוקפם

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

if ( ! wp_next_scheduled( 'savvy_cleanup_transients' ) ) {
    wp_schedule_event( time(), 'weekly', 'savvy_cleanup_transients' );
}

add_action( 'savvy_cleanup_transients', function () {
    global $wpdb;
    $wpdb->query(
        "DELETE a, b FROM {$wpdb->options} a
        LEFT JOIN {$wpdb->options} b
            ON b.option_name = REPLACE( a.option_name, '_transient_timeout_', '_transient_' )
        WHERE a.option_name LIKE '\_transient\_timeout\_%'
            AND a.option_value < UNIX_TIMESTAMP()"
    );
} );

הוסיפו ל-functions.php. ה-cron רץ פעם בשבוע ומסיר רק transients שפג תוקפם.

הסרת קישורי REST API מה-header

וורדפרס מוסיפה קישורי REST API (wp-json) ל-wp_head. אם אינכם צריכים גישה ציבורית ל-API, הסירו את הקישורים. הוסיפו ל-functions.php. לעוד על אבטחת REST API.

remove_action( 'wp_head', 'rest_output_link_wp_head' );
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'template_redirect', 'rest_output_link_header', 11 );

ביטול עדכונים אוטומטיים בוורדפרס

וורדפרס מעדכנת אוטומטית גרסאות מינוריות. אם אתם מעדיפים לשלוט בעדכונים ידנית, הוסיפו את הקוד ל-wp-config.php. לעוד על ביטול עדכונים אוטומטיים.

define( 'AUTOMATIC_UPDATER_DISABLED', true );
add_filter( 'auto_update_core', '__return_false' );
add_filter( 'auto_update_plugin', '__return_false' );
add_filter( 'auto_update_theme', '__return_false' );

ה-define הוסיפו ל-wp-config.php, וה-add_filter ל-functions.php.

הסרת jQuery Migrate

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

add_action( 'wp_default_scripts', function( $scripts ) {
	if ( ! is_admin() && isset( $scripts->registered['jquery'] ) ) {
		$script = $scripts->registered['jquery'];
		if ( $script->deps ) {
			$script->deps = array_diff( $script->deps, array( 'jquery-migrate' ) );
		}
	}
} );

הוספת גדלי תמונה מותאמים

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

add_action( 'after_setup_theme', function() {
	add_image_size( 'card-thumbnail', 400, 300, true );
	add_image_size( 'hero-banner', 1920, 600, true );
} );

החליפו את השמות והמידות לפי הצורך. השתמשו ב-true ל-crop או false ל-scale.

שינוי מספר הפוסטים בעמוד בארכיון

ברירת המחדל של וורדפרס היא 10 פוסטים בעמוד. ניתן לשנות זאת לכל הארכיונים או לארכיון ספציפי. הוסיפו ל-functions.php. לעוד על הוספת pagination.

add_action( 'pre_get_posts', function( $query ) {
	if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
		$query->set( 'posts_per_page', 12 );
	}
} );

החליפו is_home() ב-is_archive() או is_post_type_archive('your_cpt') לפי הצורך.