97 Custom type and Advanced custom fields

1. Создание произвольной записи

Вариант 1: используем сервис для генерации: generatewp.com

Вариант 2: используем заготовку с сайта kama

add_action( 'init', 'register_post_types' );
function register_post_types(){
	register_post_type('post_type_name', array(
		'label'  => null,
		'labels' => array(
			'name'               => '____', // основное название для типа записи
			'singular_name'      => '____', // название для одной записи этого типа
			'add_new'            => 'Добавить ____', // для добавления новой записи
			'add_new_item'       => 'Добавление ____', // заголовка у вновь создаваемой записи в админ-панели.
			'edit_item'          => 'Редактирование ____', // для редактирования типа записи
			'new_item'           => 'Новое ____', // текст новой записи
			'view_item'          => 'Смотреть ____', // для просмотра записи этого типа.
			'search_items'       => 'Искать ____', // для поиска по этим типам записи
			'not_found'          => 'Не найдено', // если в результате поиска ничего не было найдено
			'not_found_in_trash' => 'Не найдено в корзине', // если не было найдено в корзине
			'parent_item_colon'  => '', // для родителей (у древовидных типов)
			'menu_name'          => '____', // название меню
		),
		'description'         => '',
		'public'              => true,
		// 'publicly_queryable'  => null, // зависит от public
		// 'exclude_from_search' => null, // зависит от public
		// 'show_ui'             => null, // зависит от public
		// 'show_in_nav_menus'   => null, // зависит от public
		'show_in_menu'        => null, // показывать ли в меню адмнки
		// 'show_in_admin_bar'   => null, // зависит от show_in_menu
		'show_in_rest'        => null, // добавить в REST API. C WP 4.7
		'rest_base'           => null, // $post_type. C WP 4.7
		'menu_position'       => null,
		'menu_icon'           => null, 
		//'capability_type'   => 'post',
		//'capabilities'      => 'post', // массив дополнительных прав для этого типа записи
		//'map_meta_cap'      => null, // Ставим true чтобы включить дефолтный обработчик специальных прав
		'hierarchical'        => false,
		'supports'            => [ 'title', 'editor' ], // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats'
		'taxonomies'          => [],
		'has_archive'         => false,
		'rewrite'             => true,
		'query_var'           => true,
	) );
}

Далее этот код вставляем в файл functions.php

Или создаем отдельный файл custom-type.php в который вставляем код кастомного поста. После чего в файле functions.php подключаем файл custom-type.php:

include( get_template_directory() . '/custom-type.php' );

2. Подключаем свои поля через ACF

Устанавливаем плагин ACF.

Переходим в меню «Группы полей» > Добавить новый. Именуем новую группу полей, выбираем для каких записей будут созданы поля  и добавляем поля.

Заполняем поля:

После добавления всех полей нажать на кнопку «Опубликовать».

Проверяем. Переходим в создание новой записи и должны видеть кастомные поля:

 

3.Создаем шаблон и выводим данные из кастомных полей

Шаблон для вывода типа поста: single-name_post_type.php (single-toptovar.php)

Создаем шаблон страницы

Будем вводить все записи из кастомной категории: post-name.php (post-toptovar.php).

Добавляем в этот файл код:

<?php
/*
Template Name: Топ Товары
*/
?>

Генерируем query запрос. Используем generatewp.com Получаем следующий код:

// WP_Query arguments
$args = array(
	'post_type'              => array( 'toptovar' ),
	'posts_per_page'         => '-1',
	'order'                  => 'DESC',
	'orderby'                => 'date',
);

// The Query
$query = new WP_Query( $args );

// The Loop
if ( $query->have_posts() ) {
	while ( $query->have_posts() ) {
		$query->the_post();
		// do something
	}
} else {
	// no posts found
}

// Restore original Post Data
wp_reset_postdata();

Вставляем верстку внутри цикла:

<div class="toptovar-wrap">
<?php
// НАЧАЛО ЗАПРОСА WP_Query arguments
$args = array(
	'post_type'              => array( 'toptovar' ),
	'posts_per_page'         => '-1',
	'order'                  => 'DESC',
	'orderby'                => 'date',
);
// The Query
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
	while (  $query->have_posts() ) {
				$query->the_post(); ?>
				<div class="toptovar-item">
					<a href="<?php the_field('toptovar-url');?>" class="toptovar-img"><img src="<?php the_field('toptovar-image'); ?>" alt="" ></a>
					<div class="toptovar-text">
						<a href="<?php the_field('toptovar-url');?>" class="toptovar-title"><?php the_field('toptovar-name'); ?></a>
						<p class="toptovar-desc"><?php the_field('toptovar-desc'); ?></p>
						<p class="toptovar-price">
							<?php if ( get_field('toptovar-oldprice') ) { ?>
								<span><?php the_field('toptovar-oldprice'); ?>$</span>
							<?php } ?>
							<?php the_field('toptovar-price'); ?>$</p>
					</div>
				</div>
<?php	}
}
wp_reset_postdata();
// КОНЕЦ ЗАПРОСА
?>
</div>