חיפוש ]

מדריך ליצירת סוגי תוכן מותאמים (Custom Post Types)

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

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

יש שיאמרו כי נכון לומר ״פוסטים מותאמים אישית״, לדעתי נכון לומר ״סוגי תוכן מותאמים״ מכיוון וזוהי מטרתם – ליצור סוגים חדשים של תוכן המותאמים לצרכים שלכם…

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

קצת היסטוריה

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

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

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

מה זה סוג תוכן מותאם (CPT)?

סוג תוכן מותאם (Custom Post Type) הוא בעצם פוסט עם ערך שונה בשדה post_typeבמסד הנתונים. אם תפרסמו פוסט באתר שלכם, תגשו למסד הנתונים ותשנו את סוג התוכן מ ״post״ ל ״page״, הפוסט יופיע תחת עמודים ולא תחת פוסטים בממשק הניהול.

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

כברירת מחדל, וורדפרס מגיעה עם מספר סוגי תוכן כגון: עמודים, פוסטים, תפריטים, גירסאות (post revisions) ועמודי קובץ (attachments), לכל אחד מאלו ערך שונה בשדה post_type. וורדפרס מאפשרת לכם בצורה מאד פשוטה ליצור סוג תוכן משלכם כגון ספרים, סרטים, ביקורות, מתכונים וכל מה שתעלו על דעתכם.

יצירת סוג תוכן מותאם בוורדפרס

מתי יש להשתמש בסוגי תוכן מותאמים?

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

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

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

 אז איך יוצרים סוגי תוכן מותאמים?

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

// Register Custom Post Type
function snippet_post_type() {

	$args = array();
	register_post_type( 'snippet', $args );

}
add_action( 'init', 'snippet_post_type', 0 );

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

// Register Custom Post Type
function snippet_post_type() {

	$labels = array(
		'name'                  => _x( 'Snippets', 'Post Type General Name', 'text_domain' ),
		'singular_name'         => _x( 'Snippet', 'Post Type Singular Name', 'text_domain' ),
		'menu_name'             => __( 'Snippets', 'text_domain' ),
		'name_admin_bar'        => __( 'Snippet', 'text_domain' ),
		'archives'              => __( 'Snippet Archives', 'text_domain' ),
		'attributes'            => __( 'Snippet Attributes', 'text_domain' ),
		'parent_item_colon'     => __( 'Parent Item:', 'text_domain' ),
		'all_items'             => __( 'All Items', 'text_domain' ),
		'add_new_item'          => __( 'Add New Item', 'text_domain' ),
		'add_new'               => __( 'Add New', 'text_domain' ),
		'new_item'              => __( 'New Item', 'text_domain' ),
		'edit_item'             => __( 'Edit Item', 'text_domain' ),
		'update_item'           => __( 'Update Item', 'text_domain' ),
		'view_item'             => __( 'View Item', 'text_domain' ),
		'view_items'            => __( 'View Items', 'text_domain' ),
		'search_items'          => __( 'Search Item', 'text_domain' ),
		'not_found'             => __( 'Not found', 'text_domain' ),
		'not_found_in_trash'    => __( 'Not found in Trash', 'text_domain' ),
		'featured_image'        => __( 'Featured Image', 'text_domain' ),
		'set_featured_image'    => __( 'Set featured image', 'text_domain' ),
		'remove_featured_image' => __( 'Remove featured image', 'text_domain' ),
		'use_featured_image'    => __( 'Use as featured image', 'text_domain' ),
		'insert_into_item'      => __( 'Insert into item', 'text_domain' ),
		'uploaded_to_this_item' => __( 'Uploaded to this item', 'text_domain' ),
		'items_list'            => __( 'Items list', 'text_domain' ),
		'items_list_navigation' => __( 'Items list navigation', 'text_domain' ),
		'filter_items_list'     => __( 'Filter items list', 'text_domain' ),
	);
	$args = array(
		'label'                 => __( 'Snippet', 'text_domain' ),
		'description'           => __( 'Snippet CPT Description', 'text_domain' ),
		'labels'                => $labels,
		'supports'              => array( 'title', 'editor' ),
		'taxonomies'            => array( 'category', 'post_tag' ),
		'hierarchical'          => false,
		'public'                => true,
		'show_ui'               => true,
		'show_in_menu'          => true,
		'menu_position'         => 5,
		'show_in_admin_bar'     => true,
		'show_in_nav_menus'     => true,
		'can_export'            => true,
		'has_archive'           => true,
		'exclude_from_search'   => false,
		'publicly_queryable'    => true,
		'capability_type'       => 'post',
	);
	register_post_type( 'snippet', $args );

}
add_action( 'init', 'snippet_post_type', 0 );

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

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

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

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

ניתן מבט על חלק מהפרמטרים:

  • labels – פרמטר זה צריך להיות מערך המגדיר את התוויות שיהיו לסוג התוכן בלוח הבקרה של וורדפרס.
  • description – תיאור קצר על סוג התוכן, מה הוא עושה ומדוע אנחנו משתמשים בו.
  • exclude_from_search – יגדיר האם סוג התוכן יופיע בתוצאות החיפוש כשיתבצע חיפוש באתר.
  • menu_position – מיקום התפריט בלוח הבקרה של וורדפרס (ברירת המחדל היא מתחת לתפריט תגובות).
  • supports – מגדיר במה יתמוך סוג התוכן שיצרתם, לדוגמא כותרת, תקציר, תגובות, גירסאות וכו׳…
  • has_archive – מאפשר להציג ארכיון (archive) לסוג תוכן זה.

הצגת סוג התוכן המותאם

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

הצגת דף הארכיון (רשימת הפוסטים) של סוג התוכן שיצרתם

במידה ויצרתם סוג תוכן מותאם כשהפרמטר has_archive שווה ל true, וורדפרס (במצבה הדיפולטיבי) תציג סוג תוכן זה על ידי שימוש בקובץ archive.php. אם סוג התוכן שיצרנו נקרא snippets, תוכלו לגשת ל http:/mysite.co.il/snippet בכדי לראות את רשימת הפוסטים שיצרתם.

ההיררכיה של טעינת הקבצים בוורדפרס עובדת בצורה הבאה: במידה וקיים קובץ בשם archive-[post_type].php – או במקרה שלנו archive-snippet.php וורדפרס תשתמש בקובץ זה על מנת להציג את ארכיון הפוסטים של סוג התוכן המדובר. במידה וקובץ זה אינו קיים (והוא אינו קיים כברירת מחדל), וורדפרס תשתמש בקובץ archive.phpבכדי להציג את התוכן. וכשזה לא קיים תשתמש בקובץ index.php.

לכן, במידה ואתם רוצים לשנות את מבנה דף הארכיון של סוג התוכן snippet שיצרנו, נכון יהיה ליצור קובץ חדש בתבנית שלכם בשםarchive-snippet.php ולהעתיק אליו את הקוד מ archive.php. כעת תוכלו לשנות את הקובץ החדש שיצרתם בהתאם לדרישות העיצוב כאוות נפשכם.

הצגת דף הפוסט עצמו של סוג התוכן שיצרתם

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

במקרה של דף זה, וורדפרס כברירת מחדל תשתמש בקובץ single.php על מנת להציג את העמוד. אם תרצו לעצב או לשנות את ההתנהגות או המבנה של אותו עמוד, צרו קובץ חדש בשם single-snippet.php בתבנית שלכם, העתיקו אליו את הקוד מ single.php ובצעו את השינויים כרצונכם.

הצגת הפוסטים באמצעות הלולאה של וורדפרס

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

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

<?php
if ( get_query_var( 'paged' ) ) {
	$paged = get_query_var( 'paged' );
}
if ( get_query_var( 'page' ) ) {
	$paged = get_query_var( 'page' );
}

$query = new WP_Query( array( 'post_type' => 'snippet', 'paged' => $paged ) );

if ( $query->have_posts() ) : ?>
	<?php while ( $query->have_posts() ) : $query->the_post(); ?>
        <div class="entry">
            <h2 class="title"><?php the_title(); ?></h2>
			<?php the_content(); ?>
        </div>
	<?php endwhile;
	wp_reset_postdata(); ?>
    <!-- you can display pagination here -->
<?php else : ?>
    <!-- you can display an error here -->
<?php endif; ?>

תוכלו לשנות את סוג התוכן שיוצג בשורה מספר 9. כמו כן, המשתנה $paged נחוץ בכדי שהעימוד הממוספר יעבוד כראוי (Pagination).

נספח – סוגי תוכן מותאמים והתוסף Elementor

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

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

מילים אחרונות

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

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

 

  • רמי 8 יולי 2015, 10:58

    רועי, פוסט יפה מאוד, כל הכבוד על ההשקעה.

    מספר הערות:

    1. ראשית אין להשתמש בעברית בקוד, יש להשתמש באנגלית ולהוסיף ולהשתמש בפונקציות התרגום של וורדפרס בשילוב של textdomain.
    2. ולמה לכתוב קוד כשאפשר להשתמש בגנרטור לייצור הקוד – https://generatewp.com/post-type/
    3. ואם כבר אתה נמנע מלהשתמש בתוספים כדי ליצור סוגי פוסטים, מדוע להשתמש בתוסף ACF כדי ליצור metabox? אפשר לכתוב קוד כדי להוסיף שדות נוספים ולהרחיב את הפונקציונאליות.

    חוץ מזה, אחלה פוסט!

    • מנהל מערכת 8 יולי 2015, 11:13

      היי רמי, תודה רבה על התגובה 🙂
      לגבי סעיף 1, אתה בהחלט צודק ורצוי להשתמש בפונקציית התרגום. אדאג להוסיף את האפשרות בהקדם.
      לגבי סעיף 3, ציינתי שניתן להוסיף metaboxes בקוד ואף יותר מזה… למה להסביר על ACF ? כי הוא פלאגין מגניב מי כמוך יודע…

      • רמי 8 יולי 2015, 16:18

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

        שימוש בתוספים כמו ACF מוסיף הרבה תקורה לאתר שלך. הרי התוסף מביא פתרון כולל לכל הצרכים של כל המשתמשים, גם דברים שאתה לא צריך. ואפילו אם לא תשתמש בתוסף אלא בספרייה שיוצרת Meta Box או Custom Post Types או Taxonomy עדיין יש תקורה רבה והמון דברים מיותרים (קרוב ל-90% מהקוד לא יהיה רלוונטי לפרוייקט שלך).

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

        • מנהל מערכת 8 יולי 2015, 19:33

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

          • רמי 9 יולי 2015, 0:30

            בעבר הרבה מפתחים אמרו לי את זה על post types ועל taxonomies עד ששחררתי את הגנרטורים האוטומטיים ב-GenerateWP.com , היום הם כבר לא משתמשים בתוספים.

            עוד מעט אנחנו נשחרר MetaBox Generator ואז גם השימוש ב-ACF יפחת.

          • רמי 9 יולי 2015, 0:33

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

  • מנהל מערכת 9 יולי 2015, 1:15
    function my_remove_menu_pages() {
     
        global $user_ID;
     	$user = wp_get_current_user();
    
        if ( current_user_can( 'administrator' ) && ($user && isset($user->user_login) && 'THE_USER_NAME' == $user->user_login)) {
    		remove_menu_page('plugins.php'); // Plugins
        }
    
    add_action( 'admin_init', 'my_remove_menu_pages' );
    • רמי 19 יולי 2015, 15:52

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

  • ינון 31 מאי 2018, 2:50

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

  • דסי פ 28 אוקטובר 2018, 1:07

    שלום רועי,

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

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

    תודה רבה

    • רועי יוסף 28 אוקטובר 2018, 1:28

      היי דסי,

      מגניב שאת שמה לב לשינויים 😉 לגבי התרגום, אם את מדברת על הנראות בלוח הבקרה השליטה מתבצעת בחלק זה של הקוד שהצגתי:

      $labels = array(
      		'name'                  => _x( 'Snippets', 'Post Type General Name', 'text_domain' ),
      		'singular_name'         => _x( 'Snippet', 'Post Type Singular Name', 'text_domain' ),
      		'menu_name'             => __( 'Post Types', 'text_domain' ),
      		'name_admin_bar'        => __( 'Post Type', 'text_domain' ),
      		'archives'              => __( 'Item Archives', 'text_domain' ),
      		'attributes'            => __( 'Item Attributes', 'text_domain' ),
      		'parent_item_colon'     => __( 'Parent Item:', 'text_domain' ),
      		'all_items'             => __( 'All Items', 'text_domain' ),
      		'add_new_item'          => __( 'Add New Item', 'text_domain' ),
      		'add_new'               => __( 'Add New', 'text_domain' ),
      		'new_item'              => __( 'New Item', 'text_domain' ),
      		'edit_item'             => __( 'Edit Item', 'text_domain' ),
      		'update_item'           => __( 'Update Item', 'text_domain' ),
      		'view_item'             => __( 'View Item', 'text_domain' ),
      		'view_items'            => __( 'View Items', 'text_domain' ),
      		'search_items'          => __( 'Search Item', 'text_domain' ),
      		'not_found'             => __( 'Not found', 'text_domain' ),
      		'not_found_in_trash'    => __( 'Not found in Trash', 'text_domain' ),
      		'featured_image'        => __( 'Featured Image', 'text_domain' ),
      		'set_featured_image'    => __( 'Set featured image', 'text_domain' ),
      		'remove_featured_image' => __( 'Remove featured image', 'text_domain' ),
      		'use_featured_image'    => __( 'Use as featured image', 'text_domain' ),
      		'insert_into_item'      => __( 'Insert into item', 'text_domain' ),
      		'uploaded_to_this_item' => __( 'Uploaded to this item', 'text_domain' ),
      		'items_list'            => __( 'Items list', 'text_domain' ),
      		'items_list_navigation' => __( 'Items list navigation', 'text_domain' ),
      		'filter_items_list'     => __( 'Filter items list', 'text_domain' ),
      	);

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

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

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

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

      בשני במקרים ״שם הסניפט״ יהיה כותרת הסניפט עצמו כך שאין עניין של תרגום ה CPT במקרים אלו. מקווה שהסברתי עצמי כראוי.

      • דסי פ 28 אוקטובר 2018, 12:11

        באארור ששמים לב. וזה ממש כיף לגלות דברים חדשים מידי פעם.

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

  • דוד 2 מרץ 2020, 13:08

    אני רוצה להוסיף קטגוריה חדש של "מתכונים" הוסף מתכון חדש וכו' כמו פוסטים אבל עם שם אחר. יש לי 2 שאלות:
    1. לא הבנתי היכן אני מעתיק את הקוד השני. "נוסיף כמה הגדרות למערך הריק בקוד מעלה ($args):" היכן בדיוק מוסיפים, מהו "מערך הריק"? אשמח לדוגמה לקוד השלם לאחר הדבקה.
    2. היכן אני מוסיף את המילים בקוד "מתכונים" הוסף מתכון חדש" וכו'.

    תודה רבה

    • רועי יוסף 2 מרץ 2020, 19:29

      היי דוד,

      הנה הקוד השלם עבורך:

      // Register Custom Post Type
      function recipe_post_type()
      {
      
          $labels = array(
              'name' => _x('מתכונים', 'Post Type General Name', 'text_domain'),
              'singular_name' => _x('מתכון', 'Post Type Singular Name', 'text_domain'),
              'menu_name' => __('מתכונים', 'text_domain'),
              'name_admin_bar' => __('מתכון', 'text_domain'),
              'archives' => __('מתכון ארכיון', 'text_domain'),
              'attributes' => __('מתכון תכונות', 'text_domain'),
              'parent_item_colon' => __('Parent Item:', 'text_domain'),
              'all_items' => __('כל המתכונים', 'text_domain'),
              'add_new_item' => __('Add New Item', 'text_domain'),
              'add_new' => __('הוסף מתכון חדש', 'text_domain'),
              'new_item' => __('New Item', 'text_domain'),
              'edit_item' => __('Edit Item', 'text_domain'),
              'update_item' => __('Update Item', 'text_domain'),
              'view_item' => __('View Item', 'text_domain'),
              'view_items' => __('View Items', 'text_domain'),
              'search_items' => __('Search Item', 'text_domain'),
              'not_found' => __('Not found', 'text_domain'),
              'not_found_in_trash' => __('Not found in Trash', 'text_domain'),
              'featured_image' => __('Featured Image', 'text_domain'),
              'set_featured_image' => __('Set featured image', 'text_domain'),
              'remove_featured_image' => __('Remove featured image', 'text_domain'),
              'use_featured_image' => __('Use as featured image', 'text_domain'),
              'insert_into_item' => __('Insert into item', 'text_domain'),
              'uploaded_to_this_item' => __('Uploaded to this item', 'text_domain'),
              'items_list' => __('Items list', 'text_domain'),
              'items_list_navigation' => __('Items list navigation', 'text_domain'),
              'filter_items_list' => __('Filter items list', 'text_domain'),
          );
          $args = array(
              'label' => __('מתכון', 'text_domain'),
              'description' => __('תיאור מתכון', 'text_domain'),
              'labels' => $labels,
              'supports' => array('title', 'editor'),
              'taxonomies' => array('category', 'post_tag'),
              'hierarchical' => false,
              'public' => true,
              'show_ui' => true,
              'show_in_menu' => true,
              'menu_position' => 5,
              'show_in_admin_bar' => true,
              'show_in_nav_menus' => true,
              'can_export' => true,
              'has_archive' => true,
              'exclude_from_search' => false,
              'publicly_queryable' => true,
              'capability_type' => 'post',
          );
          register_post_type('recipe', $args);
      
      }
      
      add_action('init', 'recipe_post_type', 0);
  • איש 7 יוני 2020, 18:09

    הי !
    אני רואה את הפוסט בלוח הבקרה, אבל כשאני פותח את הקישור שלו אני מגיע לדף 404, מה קרה ?

    • רועי 7 יוני 2020, 18:34

      כנס להגדררות > קישורים (permalinks) ושמור את הקישורים הישירים..

  • אירית הרמן 1 נובמבר 2020, 12:29

    שלום,

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

    יש לך רעיון? תודה

    • רועי יוסף 1 נובמבר 2020, 22:45

      היי אירית,

      אני קצת מבולבל מהשאלה שלך (שדות מותאמים או פוסטים מותאמים?). אם תנסחי מחדש אנסה לעזור….. 🙂

  • idan 26 מאי 2021, 14:01

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

    • רועי יוסף 26 מאי 2021, 14:02

      היי עידן,

      פנה אליי דרך טופס צור קשר בבקשה..

  • יאיר חפץ 7 פברואר 2022, 16:44

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

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

    מקווה שהבנת 🙂

    אבל השאלה שלי האם זו דרך נכונה ליצור בלוג שמקודם גם ב-S.E.O? והאם אתם ממליצים לעשות את זה?

  • ענת 11 יוני 2024, 15:32

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

    • רועי יוסף 11 יוני 2024, 17:25

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

      • ענת 18 יוני 2024, 13:20

        הי רועי, תודה רבה על המענה!

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

        ניסיתי את התשובה של Matt Keys, אך יתכן שעשיתי טעות במשהו וזה השפיע לרעה גם על עמודי קטגוריות (הרגילות באתר) שאי אפשר היה להכנס אליהם, וגם לא הצלחתי להכנס לעמוד ארכיון של ה CPT. למזלי לפני הניסיון הזה ווידאתי שיש לי גיבוי לאתר והייתי בהיכון לשחזור…

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

        ראיתי שיש כאלו שהציעו בעבר פתרון של קוד ועברו לשימוש בתוסף, בין היתר הוזכר Permalink Manager Lite. כרגע מתלבטת אם להסתמך על תוסף, או להשאיר את הפרמלינק היפה שלי כמו שהוא… 🙂

תגובה חדשה

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

Savvy WordPress Development