Хей, имам нещо специално за теб!
Попълни имейл адрес, на който до минута ще получиш обещаното ;)
По подразбиране, при нова инсталация на WordPress получаваш три post type вида: posts, pages и media. За щастие, след версия 2.9 вече можем да създаваме колкото и каквито си искаме custom post types. А за какво са ти необходими и как да ги прилагаш в реалния свят, след малко!
17.02.2024г. от 10:30 часа
Потребителския тип пост (custom-post-type) не се различава по нищо от стандартния тип пост, с изключение на post-type стойността си в базата данни. Например, за постове тип страница имаме стойност page, за постове тип медия имаме стойност attachment, а за обикновена публикация стойността е post. В тази връзка, вече можеш да създаваш post-type със стойност, например, movies, books, episodes и пр.
Създаден и конфигуриран правилно, custom post type може да ти помогне да постигнеш следното с няколко реда код:
Отделно от всичко това, можеш да укажеш още десетки опции, например къде в менюто да се появи новият custom post type, дали да може да се търси в него, потребители с какви права могат да го достъпват, дали да е с йерархия и др.
За ефективно създаване и използване на 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 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, за който ще се отнася.
За да имаш нужда от 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 😉
Здравей, може ли помощ как да променя съдържанието в админ панела да не е все едно създавам страница а да е като продукт.
П.П. Смисъла е да направя два отделни продукт layout-a
Здравей,
въпросът е субективен и от разбраното мога да предположа, че става въпрос точно за създаване на Custom Post Type. Ако е така, следвай стъпките в статията и създай своя CPT, като го регистрираш във functions.php файла (или където инициализираш функциите за сайта) на темата (или child темата).
Самият admin layout може да контролираш с, например, Advanced Custom Fields – виж повече тук – https://www.advancedcustomfields.com/
Надявам се това да е от полза.
Stay blond 😉
Имам в предвид как да свържа Custom Post Type-а с woocommerce така, че той да бъде с цена вариаций и тн.? Благодаря предварително!