Вопрос или проблема
У меня есть отдельный раздел поиска для пользовательского типа записи продуктов. Требуется результат на той же странице с постраничной навигацией, и при нажатии на любой результат он отображается на отдельной странице. Но все в продукте пользовательской записи, странице продукта, шаблоне продукта, одном продукте. Ниже представлена форма и небольшой код.
<form role="search" method="get" id="searchform" action="<?php echo esc_url( home_url( "https://wordpress.stackexchange.com/" ) ); ?>">
<div class="row">
<div class="col-md-3">Ключевое слово для поиска:</div>
<div class="col-md-3"><input type="text" placeholder="Поиск продукта..."></div>
<div class="col-md-2"><input type="submit" id="searchsubmit" value="Поиск"> <input type="hidden" name="post_type" value="product"></div>
</div>
<div class="row">
<lable for="r1"><input type="radio" name="product-filter" id="r1" checked="chcecked"> Любые слова</lable>
<lable for="r2"><input type="radio" name="product-filter" id="r2"> Все слова</lable>
<lable for="r3"><input type="radio" name="product-filter" id="r3"> Точная фраза</lable>
</div>
<em>Термин поиска должен содержать минимум 3 символа и максимум 20 символов</em>
</form>
Ниже представлен мой пользовательский тип записи
add_action('init', 'product_register');
function product_register() {
$args = array(
'label' => __('Продукты'),
'singular_label' => __('Продукт'),
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => true,
'supports' => array('title', 'editor', 'thumbnail')
);
register_post_type('product', $args);
}
add_action('admin_init', 'admin_init');
register_taxonomy('catalog', array('product'),
array('hierarchical' => true,
'label' => 'Каталоги',
'singular_label' => 'Каталог',
'rewrite' => true)
);
function admin_init() {
add_meta_box('prodInfo - meta', 'Опции продукта', 'meta_options', 'product', 'side', 'low');
}
function meta_options() {
global $post;
$custom = get_post_custom($post -> ID);
$price = $custom['price'][0];
echo '<label> Цена: </label><input type="text" name="price" value="'. $price .'"/ > ';
}
function save_price() {
global $post;
update_post_meta($post->ID, 'price', $_POST['price']);
}
add_action('save_post', 'save_price');
Как я могу показать результат в div?
Также это перенаправляет меня на страницу с конкретным результатом.
Пожалуйста, дайте совет или направление?
1. Создайте single-(cpt).php в вашей теме, скопируйте ваш single.php и переименуйте его в соответствии с именем вашего пользовательского типа записи, чтобы этот шаблон страницы использовался для отображения ваших запросов к пользовательскому типу записи.
Для получения более подробной информации обратитесь к кодексу WordPress.
https://codex.wordpress.org/Category_Templates
Чтобы создать страницу архива CPT, следуйте той же процедуре.
archive-(cpt).php
Для таксономий
taxonomy-(cpt).php
CPT — это имя вашего пользовательского типа записи.
Ознакомьтесь с приведенной ниже статьей, чтобы получить результаты поиска с помощью AJAX.
https://premium.wpmudev.org/blog/how-to-use-ajax-in-wordpress-to-load-search-results/?ptm=c&utm_expid=3606929-108.O6f5ypXuTg-XPCV9sY1yrw.2&utm_referrer=https%3A%2F%2Fwww.google.com%2F
.
Ответ или решение
Для того чтобы настроить поиск и отображение кастомных типов записей (Custom Post Type, CPT) в WordPress, требуется определенный подход и знание о том, как WordPress работает с шаблонами и AJAX технологиями. Рассмотрим пошагово, как добиться этого:
1. Теория
WordPress предоставляет мощную систему для работы с кастомными типами записей, позволяющую разработчикам создавать, изменять и управлять такими записями. Ваша задача состоит в создании формы для поиска, которая отправляет запрос на сервер и отображает результаты на той же странице. Чтобы это осуществить, можно использовать AJAX, который позволяет загружать данные в фоне без перезагрузки страницы. Это не только улучшает пользовательский опыт, но и позволяет более гибко управлять динамическим контентом.
Для создания шаблонов отображения используются файлы с именами, соответствующими вашим типам записей и таксономиям, такие как single-(cpt).php
и archive-(cpt).php
. Это дает WordPress возможность понимать, какой шаблон использовать для отображения соответствующих данных.
2. Пример
PHP и WordPress часть
Шаблон поиска, предоставляемый вами, имеет небольшой недостаток в action
формы. Она должна быть направлена на домашнюю страницу, а не на другой сайт. Исправим это:
<form role="search" method="get" id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<div class="row">
<div class="col-md-3">Search Keyword:</div>
<div class="col-md-3"><input type="text" name="s" placeholder="Search Product..."></div>
<div class="col-md-2">
<input type="submit" id="searchsubmit" value="Search">
<input type="hidden" name="post_type" value="product">
</div>
</div>
<div class="row">
<label for="r1"><input type="radio" name="product-filter" id="r1" value="any" checked="checked"> Any Words</label>
<label for="r2"><input type="radio" name="product-filter" id="r2" value="all"> All Words</label>
<label for="r3"><input type="radio" name="product-filter" id="r3" value="exact"> Exact Phrase</label>
</div>
<em>Search term must be a minimum of 3 characters and a maximum of 20 characters</em>
</form>
Перейдем к созданию кастомного типа записи:
add_action('init', 'product_register');
function product_register() {
$args = array(
'label' => __('Products'),
'singular_label' => __('Product'),
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => array('slug' => 'products'),
'supports' => array('title', 'editor', 'thumbnail')
);
register_post_type('product', $args);
}
Создание таксономии для категорий продуктов:
register_taxonomy('catalog', array('product'), array(
'hierarchical' => true,
'label' => 'Catalogs',
'singular_label' => 'Catalog',
'rewrite' => true
));
AJAX часть
Для использования AJAX в WordPress, сначала добавьте следующий скрипт в файл functions.php
:
function my_enqueue_scripts() {
wp_enqueue_script('jquery');
wp_enqueue_script('ajax-script', get_template_directory_uri() . '/ajax-script.js', array('jquery'), null, true);
wp_localize_script('ajax-script', 'my_ajax_obj', array(
'ajax_url' => admin_url('admin-ajax.php'),
));
}
add_action('wp_enqueue_scripts', 'my_enqueue_scripts');
Создайте файл ajax-script.js
в корневой директории вашей темы:
jQuery(document).ready(function($) {
$('#searchform').submit(function(e) {
e.preventDefault();
var searchKeyword = $('input[name="s"]').val();
var filter = $('input[name="product-filter"]:checked').val();
$.ajax({
url: my_ajax_obj.ajax_url,
method: 'POST',
data: {
action: 'get_search_results',
keyword: searchKeyword,
filter: filter
},
success: function(response) {
$('#search-results').html(response);
}
});
});
});
Добавьте обработчик AJAX на серверной стороне:
add_action('wp_ajax_get_search_results', 'get_search_results');
add_action('wp_ajax_nopriv_get_search_results', 'get_search_results');
function get_search_results() {
$keyword = $_POST['keyword'];
$filter = $_POST['filter'];
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
's' => $keyword,
);
// Примените нужный фильтр в зависимости от выбранного значения
if ($filter == 'all') {
$args['s'] = '"' . implode(' ', explode(' ', $keyword)) . '"';
} elseif ($filter == 'exact') {
$args['s'] = '"' . $keyword . '"';
}
$query = new WP_Query($args);
if($query->have_posts()) {
while($query->have_posts()) : $query->the_post();
echo '<div>' . get_the_title() . '</div>';
endwhile;
} else {
echo '<p>No products found with the provided search criteria.</p>';
}
wp_die();
}
3. Применение
Теперь у вас есть форма поиска, которая использует AJAX для получения результатов и отображает их на той же странице в блоке, который вы можете добавить на страницу шаблона, например, так:
<div id="search-results"></div>
Этот подход позволяет оставаться на той же странице и получать результаты поиска без необходимости перезагрузки страницы, что значительно улучшает взаимодействие пользователей с вашим сайтом. Результаты отображаются в HTML-блоке #search-results
, что позволяет вам стилизовать их так, как вам нужно.
Заключение
При правильном подходе к реализации, использование кастомных типов записей и AJAX в WordPress значительно повышает удобство и функциональность сайта, предоставляя пользователям возможность получить доступ к нужной информации быстро и удобно.