Language EN
חיפוש

הוספת עימוד ממוספר (Pagination) בתבנית וורדפרס ללא תוסף

רוצים להחליף את קישורי "פוסטים הבאים" ו"פוסטים קודמים" בעימוד ממוספר? בעוד תוספים כמו WP-PageNavi יכולים לעשות זאת, הוספת עימוד ידנית שומרת על התבנית קלת משקל ומונעת טעינת קבצי CSS ו-JavaScript מיותרים.

וורדפרס כוללת פונקציה מובנית בשם paginate_links() שיוצרת עימוד ממוספר לכל שאילתה (query) בתבנית שלכם.

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

<?php $args = array(
 'base' => '%_%',
 'format' => '?page=%#%', // the '%#%' will be replaced with the page number
 'total' => 1,
 'current' => 0,
 'show_all' => False,
 'end_size' => 1,
 'mid_size' => 2,
 'prev_next' => True,
 'prev_text' => __('« Previous'),
 'next_text' => __('Next »'),
 'type' => 'plain',
 'add_args' => False,
 'add_fragment' => '',
 'before_page_number' => '',
 'after_page_number' => ''
); ?>

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

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

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

הוספת Pagination לתבנית וורדפרס

הוסיפו את הקוד הבא לקובץ functions.php בתבנית הבת שלכם (או בכל קובץ שאתם רואים לנכון בתבנית שלכם):

/**
 * Pagination for archive, taxonomy, category, tag and search results pages
 *
 * @global $wp_query https://developer.wordpress.org/reference/classes/wp_query/
 * @return Prints the HTML for the pagination if a template is $paged
 */
function sv_pagination() {
	global $wp_query;

	$next_arrow = is_rtl() ? '>' : '<';
	$prev_arrow = is_rtl() ? '<' : '>';

	$total = $wp_query->max_num_pages;

	$big = 999999999; // This needs to be an unlikely integer

	// For more options and info view the docs for paginate_links()
	// https://developer.wordpress.org/reference/functions/paginate_links/
	$paginate_links = paginate_links( array(
		'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link($big) ) ),
		'current' => max( 1, get_query_var('paged') ),
		'total' => $total,
		'show_all' => true,
		'prev_text'	 => $prev_arrow,
		'next_text'	 => $next_arrow
	) );

	// Display the pagination if more than one page is found
	if ( $paginate_links ) {
		echo '<div class="pagination">';
		echo $paginate_links;
		echo '</div>';
	}
}

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

$translated = __( 'Page', 'mytextdomain' );

ולאחר מכן הוסיפו את הפרמטר הבא למערך של paginate_links בקוד מעלה.

'before_page_number' => '<span class="accessible-txt">'.$translated.' </span>'

מניח כי תרצו להסתיר את הקלאס accessible-txt בקובץ ה css שלכם…

עיצוב ה Pagination

נשתמש ב Flexbox על מנת להקל על העניינים. בכדי לעצב את העימוד הממוספר כמו בלוג זה – הוסיפו את הקוד הבא לקובץ style.css של תבנית הבת שלכם:

.pagination {
 display: flex;
 justify-content: space-between;
 flex-flow: row wrap;
}

.pagination > * {
 color: #2d2d2d;
 border-radius: 50%;
 text-align: center;
 flex-basis: 36px;
 line-height: 36px;
 min-width: 36px;
 margin: 4px 0;
 background: #f3f3ef;
}

.pagination > a:hover,
.pagination span.current {
 background-color: #942762;
 color: #fefefe;
}

הוספת ה Pagination לתבנית שלכם

הוסיפו את השורה הבאה היכן שתרצו שהעימוד יופיע – בדרך כלל ב-index.php, category.php, archive.php, או בתבנית עמוד מותאמת שלכם:

<?php sv_pagination(); ?>

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

לולאה מותאמת (Custom Query)?

אם אתם משתמשים בלולאה מותאמת באמצעות WP_Query, העימוד לא יעבוד עם המשתנה $wp_query הדיפולטיבי. במקום זאת, קראו לשאילתה המותאמת $sv_query:

$sv_query = new WP_Query( $args );

לאחר מכן שנו את פונקציית העימוד כך שתזהה את השאילתה המותאמת ותתאים את $total בהתאם:

global $wp_query, $sv_query;
if ( $sv_query ) {
 $total = $sv_query->max_num_pages;
} 
else {
 $total = $wp_query->max_num_pages;
}

הלולאה המותאמת שלכם אמורה בעיקרון להראות בסגנון הבא:

<?php
 $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

 $args = array(
 'post_type' => 'post', // You can add a custom post type if you like
 'posts_per_page' => 6,
 'paged' => $paged
 );
 $sv_query = new WP_Query( $args );

 if ( $sv_query->have_posts() ) : while ( $sv_query->have_posts() ) : $sv_query->the_post();

 //*** Post content goes here 

 endwhile;
 sv_pagination();
 wp_reset_postdata();
 else :

 //*** If no posts found message goes here 

 endif;
?>

שימו לב שלאחר סיום הלולאה אנו קוראים ל-wp_reset_postdata() כדי לשחזר את המשתנה הגלובלי $post. זה חיוני בעת שימוש בלולאות WP_Query מותאמות.

שאלות נפוצות

מה ההבדל בין paginate_links() ל-the_posts_pagination()?
the_posts_pagination() היא פונקציה ברמה גבוהה יותר שהוצגה בוורדפרס 4.1 ומייצרת עימוד נגיש עבור השאילתה הראשית עם מינימום הגדרות. paginate_links() היא פונקציה ברמה נמוכה יותר שמעניקה שליטה מלאה על הפלט ועובדת עם לולאות WP_Query מותאמות. השתמשו ב-the_posts_pagination() למקרים פשוטים וב-paginate_links() כשצריך עיצוב מותאם או שאילתות מותאמות.
למה העימוד לא עובד עם WP_Query?
לולאות WP_Query מותאמות צריכות שהפרמטר 'paged' יוגדר נכון. ודאו שאתם מעבירים get_query_var('paged') לארגומנטים של השאילתה ושפונקציית העימוד משתמשת ב-max_num_pages של השאילתה המותאמת ולא של $wp_query הגלובלי. כמו כן, זכרו לקרוא ל-wp_reset_postdata() אחרי הלולאה.
כיצד להנגיש עימוד בוורדפרס?
השתמשו בפרמטר before_page_number ב-paginate_links() כדי להוסיף טקסט ידידותי לקוראי מסך כמו "עמוד" לפני כל מספר. עטפו את העימוד באלמנט nav עם aria-label. הפרמטר aria_current (ברירת מחדל 'page') מסמן אוטומטית את העמוד הנוכחי עבור טכנולוגיות מסייעות.
האם כדאי להשתמש בתוסף לעימוד או להוסיף ידנית?
ברוב המקרים, עימוד ידני באמצעות paginate_links() או the_posts_pagination() עדיף. זה מונע טעינת קבצי CSS ו-JavaScript מיותרים, מעניק שליטה מלאה על ה-markup והעיצוב, ושומר על התבנית קלת משקל. תוספים כמו WP-PageNavi שימושיים אם צריך פתרון מהיר ללא כתיבת קוד.
האם עימוד משפיע על SEO?
כן. עימוד ממוספר עוזר למנועי חיפוש לגלות ולסרוק את כל התוכן שלכם. הוא גם משפר את חווית המשתמש, שהיא גורם דירוג עקיף. לשיטות עבודה מומלצות ב-SEO, ודאו שלכל עמוד ממוספר יש כתובת קנונית ייחודית ושקלו שימוש בתגיות canonical עצמיות בכל עמוד.

סיכום

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

לשיקולי SEO סביב עמודים ממוספרים, עיינו במדריך שלנו על עימוד ותגיות rel=next ו-rel=prev.

דיון ותגובות
2 תגובות  ]
  • אלון גולדמן 15 אוקטובר 2018, 16:43

    הפונקציה עבדה אצלי בלולאה של וורדפרס – אבל כשרציתי לעשות בלולאה עם WP QUREY אז היתה שגיאה… זה הציג מספרי עמודים, אבל אחרי עמוד 3 זה עשה לי משום מה בעיות (והיו מספיק פוסטים).
    מוזר, אבל לא הצלחתי להבין מה הסיפור.

    בכל מקרה תודה!!!

  • אביב 13 פברואר 2019, 12:48

    היי, לפי מה שאני יודע, אם רוצים לעשות custom query בעמוד הראשי, זה לא עובד.
    הבנתי שצריך לשנות את paged ל page… תוכל בבקשה לתת על זה הסבר?

    תודה רבה ואחלה מדריך

השאירו תגובה

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

Savvy WordPress Development official logo