Хей, имам нещо специално за теб!

5 грешки, които допускаш по време на интервю

Попълни имейл адрес, на който до минута ще получиш обещаното ;)

Как да създадеш WordPress custom post type [пълно ръководство]

В този урок ще разбереш какво представлява custom post type-a в WordPress и как да го използваш най-ефективно.

По подразбиране, при нова инсталация на WordPress получаваш три post type вида: posts, pages и media. За щастие, след версия 2.9 вече можем да създаваме колкото и каквито си искаме custom post types. А за какво са ти необходими и как да ги прилагаш в реалния свят, след малко!

Запиши се за workshop „Превръщане на статичен HTML темплейт в WordPress тема“

17.02.2024г. от 10:30 часа

Какво представлява custom post type в WordPress?

Потребителския тип пост (custom-post-type) не се различава по нищо от стандартния тип пост, с изключение на post-type стойността си в базата данни. Например, за постове тип страница имаме стойност page, за постове тип медия имаме стойност attachment, а за обикновена публикация стойността е post. В тази връзка, вече можеш да създаваш post-type със стойност, например, movies, books, episodes и пр.

custom post type в меню

Създаден и конфигуриран правилно, custom post type може да ти помогне да постигнеш следното с няколко реда код:

  • новосъздаденият custom post type ще се появи в администрацията на WordPress като отделно меню с опции „Добави нов“
  • навигирайки до адрес https://yoursite.com/yourcustomposttype ще те отведе до архивна страница с всички публикации от този тип
  • може да активираш категории и тагове за custom post type, а също можеш да създаваш и нови taxonomies

Отделно от всичко това, можеш да укажеш още десетки опции, например къде в менюто да се появи новият custom post type, дали да може да се търси в него, потребители с какви права могат да го достъпват, дали да е с йерархия и др.

Как да работиш с Custom post type?

За ефективно създаване и използване на custom post type, трябва да си запознат със следните (спокойно, ще разгледаме всяка точка задълбочено 😉 ):

  • създаване на custom post type
  • създаване на custom taxonomies
  • създаване на custom template за новият CPT

➡️ Създаване на Custom post type

Като повечето неща в WordPress, и тук разполагаме с готова функция register_post_type();:

function my_custom_post_product() {
  $args = array();
  register_post_type( 'portfolio', $args ); 
}

add_action( 'init', 'my_custom_post_portfolio' );

Създаден в най-простата си форма (горе), този custom post type не притежава почти никаква персонализация. Няма да бъде публичен, няма да се показва в админа, съобщенията при интеракция ще са същите като за публикация по подразбиране и т.н. За да добавим собствени настройки, които да отговарят на нуждите ни, трябва да добавим определени аргументи и параметри в $args масива (който в примерът по-горе е празен):

function my_custom_post_project() {
  $labels = array(
    'name'               => __('Projects', 'theme'),
    'singular_name'      => __('Project', 'theme'),
    'menu_name'          => __('Projects', 'theme'),
    'all_items'          => __('All Projects', 'theme'),
    'view_item'          => __('View Project', 'theme'),
    'add_new_item'       => __('Add New Project', 'theme'),
    'add_new'            => __('Add New', 'theme'),
    'edit_item'          => __('Edit Project', 'theme'),
    'update_item'        => __('Update Project', 'theme'),
    'search_items'       => __('Search in Projects', 'theme'),
    'not_found'          => __('Not Found', 'theme'),
    'not_found_in_trash' => __('Not Found in Trash', 'theme'),
  );
  
  $supports = array(
    'title', // post title
    'editor', // post content
    'author', // post author
    'thumbnail', // featured images
    'excerpt', // post excerpt
    'custom-fields', // custom fields
    'comments', // post comments
    'revisions', // post revisions
    'post-formats', // post formats
  );
  
  $args = array(
    'label'              => __('Project', 'theme'),
    'description'        => __('All Projects lives here', 'theme'),
    'labels'             => $labels,
    'hierarchical'       => true,
    'public'             => true,
    'show_ui'            => true,
    'show_in_menu'       => true,
    'show_in_nav_menus'  => true,
    'show_in_admin_bar'  => true,
    'can_export'         => true,
    'has_archive'        => true,
    'publicly_queryable' => true,
    'show_in_rest'       => true,
    'menu_icon'          => 'dashicons-image-filter',
    'menu_position'      => 8,
    'supports' => $supports,
  );
  register_post_type( 'project', $args ); 
}

add_action( 'init', 'my_custom_post_product' );
  • $supports масивът указва дали новият custom post type поддържа основни настройки/свойства, като например коментари, заглавие, кратко описание, основен редактор, ревизии и др.
  • $labels масивът съдържа всички настройки на новият custom post type за администрацията – тук може да настроиш как да се изписва името му в менюто, какви системни съобщения да се показват и др.
  • $args масивът съхранява информация за това какъв да е slug-ът на новият custom post type, на коя позиция да е в лявото меню в администрация, каква иконка да има и др.

⭐ А за иконка, която да се показва в менюто в администрация, може да използваш dashicons.

➡️ Създаване на Custom taxonomies за новият custom post type

Стандартните публикации използат категории и тагове, с които създават организационната структура на сайта. Тази структура, обаче, може да не е приложима за новосъздадения custom post type. Например, в стандартните публикации може да имаш категории „новини“ и „участия“, които обаче не са приложими за CPT Projects, където вероятно ще искаш да имаш „design“, „marketing“, „brands“.

За щастие, и за това има решение в лицето възможността за създаване на custom taxonomy. Ето и би изглеждал кодът за едно custom taxonomy към CPT projects:

function registerProjectTypeTaxonomy() {
  $labels = [
    'name'		    => __('Project type', 'theme'),
    'singular_name'	    => __('Project type', 'theme'),
    'search_items'	    => __('Search Project types', 'theme'),
    'popular_items'	    => __('Popular Project types', 'theme'),
    'all_items'             => __('All Project types', 'theme'),
    'parent_item'	    => __('Parent Project types', 'theme'),
    'parent_item_colon'	    => __('Parent Project types', 'theme'),
    'edit_item'             => __('Edit Project type', 'theme'),
    'update_item'	    => __('Update Project type', 'theme'),
    'add_new_item'	    => __('Add New Project type', 'theme'),
    'new_item_name'	    => __('New Project type', 'theme'),
    'add_or_remove_items'   => __('Add or remove type', 'theme'),
    'choose_from_most_used' => __('Choose from most used project types', 'theme'),
    'menu_name'		    => __('Types', 'theme'),
  ];

    $test = register_taxonomy(  
        'project-types',
        'project',
        array(
            'labels' => $labels,
            'hierarchical' => true,  
            'query_var' => true,
            'show_admin_column' => true,
            'show_in_nav_menus' => true,
            'show_tagcloud' => true,
            'show_in_rest' => true,
            'has_archive' => false,
            'with_front' => false,
            'rewrite' => ['slug' => 'types','with_front' => false]
        )  
    );

        register_taxonomy_for_object_type('project', 'project-types'); // assign this taxonomy to the CPT you have
    }    
    
    add_action('init', 'registerProjectTypeTaxonomy');

Важното тук е да „назначиш“ точно това taxonomy към custom post type-a, за който ще се отнася.

➡️ Създаване на template за новият custom post type

За да имаш нужда от custom post type, то най-вероятно целта ти е да имаш определен изглед и функционалности за всяка публикация, добавена към него. Например, ако типът пост е Projects, може би ще желаеш да имаш галерия с изображения, case study секция, testimonial секция и пр., като този темплейт страница няма да има нищо общо с темплейта за обикновена публикация.

По подразбиране всички публикации използват single.php файлът за темплейт. За да създадеш нов (и съответно различаващ се) такъв, отиди в основната директория на темата (root) и създай нов файл, като след single напишеш slug името на custom post type-a. Например, ако имаш custom post type, наречен projects, то темплейтният ти файл трябва да е именуван single-projects.php.

По този начин указваш на WordPress, че искаш всички публикации, които са от custom post type „projects“ да използват темплейт single-projects.php.

В новосъздаденият темплейт може да имаш различен layout от този в стандартния, различни полета и като цяло – да представяш специализирана информация по по-специален и отличаващ се начин.

С това урокът за създаване на custom post type и всички негови особености приключва, надявам се ти е от полза.

Stay blond 😉

3 Коментара

Остави коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

  1. Здравей, може ли помощ как да променя съдържанието в админ панела да не е все едно създавам страница а да е като продукт.
    П.П. Смисъла е да направя два отделни продукт layout-a

  2. Здравей,
    въпросът е субективен и от разбраното мога да предположа, че става въпрос точно за създаване на Custom Post Type. Ако е така, следвай стъпките в статията и създай своя CPT, като го регистрираш във functions.php файла (или където инициализираш функциите за сайта) на темата (или child темата).

    Самият admin layout може да контролираш с, например, Advanced Custom Fields – виж повече тук – https://www.advancedcustomfields.com/

    Надявам се това да е от полза.
    Stay blond 😉

  3. Имам в предвид как да свържа Custom Post Type-а с woocommerce така, че той да бъде с цена вариаций и тн.? Благодаря предварително!