Вопрос или проблема
Я создал на бэкэнде пользовательский тип записи с сортировкой по меню_order, как вы можете видеть на скриншоте. http://prntscr.com/gacw95
На бэкэнде сортировка по возрастанию/убыванию работает отлично.
Но мне нужно сортировать ASC/DESC и на фронтэнде.
Когда я кликаю на вкладку порядка на бэкэнде, сортировка постов происходит на бэкэнде, но не на фронтэнде.
Как мне отсортировать пользовательские записи на фронтэнде при изменении на бэкэнде?
Код бэкэнда
<?php
// ptype_gallery Custom Post Type
add_action( 'init', 'ptype_gallery_post_type' );
function ptype_gallery_post_type() {
register_post_type( 'ptype_gallery',
array(
'labels' => array(
'name' => __( 'Gallery', 'theme' ),
'singular_name' => __( 'Gallery', 'theme' ),
'add_new' => __( 'Add New Gallery', 'theme' ),
'add_new_item' => __( 'Add New Gallery', 'theme' ),
'edit_item' => __( 'Edit Gallery', 'theme' ),
'new_item' => __( 'New Gallery', 'theme' ),
'all_items' => __( 'All Gallery', 'theme' ),
'view_item' => __( 'View Gallery', 'theme' ),
'search_items' => __( 'Search Gallery', 'theme' ),
'not_found' => __( 'No Gallery found', 'theme' ),
'not_found_in_trash' => __( 'No Gallery found in Trash', 'theme' ),
'parent_item_colon' => '',
'menu_name' => __( 'Gallery', 'theme')
),
'public' => true,
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 26,
'supports' => array( 'title', 'page-attributes', 'thumbnail', 'editor' ),
'rewrite' => array( 'slug' => 'gallery', 'with_front' => true ),
'menu_icon' => 'dashicons-format-gallery', // Icon Path
)
);
}
// MetaBox
add_action( 'admin_init', 'ptype_gallery_register_meta_box' );
function ptype_gallery_register_meta_box()
{
// Check if plugin is activated or included in theme
if ( !class_exists( 'RW_Meta_Box' ) )
return;
$prefix = 'ptype_gallery_';
$meta_box = array(
'id' => 'gallery-settings',
'title' => 'Photo Gallery',
'pages' => array( 'ptype_gallery' ),
'context' => 'normal',
'priority' => 'core',
'fields' => array(
/*array(
'name' => 'Specifications',
'desc' => '',
'id' => $prefix . 'specs',
'type' => 'textarea',
'std' => '',
'rows' => '10'
),*/
array(
'name' => 'Gallery Images',
'desc' => '',
'id' => $prefix . 'images',
'type' => 'image_advanced'
),
)
);
new RW_Meta_Box( $meta_box );
}
// Add a new column for the order
function add_new_ptype_gallery_column($ptype_gallery_columns) {
$ptype_gallery_columns['menu_order'] = "Order";
return $ptype_gallery_columns;
}
add_action('manage_edit-ptype_gallery_columns', 'add_new_ptype_gallery_column');
// Render the column values
function show_order_column_gallery($name){
global $post;
switch ($name) {
case 'menu_order':
$order = $post->menu_order;
echo $order;
break;
default:
break;
}
}
add_action('manage_ptype_gallery_posts_custom_column','show_order_column_gallery');
// Set the column to be sortable
function order_column_register_sortable_gallery($columns){
$columns['menu_order'] = 'menu_order';
return $columns;
}
add_filter('manage_edit-ptype_gallery_sortable_columns','order_column_register_sortable_gallery');
?>
Код фронтэнда
Template Name: Photo Gallery Page Template
*/
get_header();
?>
<div id="main">
<div class="wrapper">
<div id="container" class="fullwidth photo-gallery-section">
<h2 class="pageTitle">
<?php the_title(); ?>
</h2>
<?php
$args = array(
'post_type' => 'ptype_gallery', 'posts_per_page' => -1, 'post_status' => 'publish'
);
// the query
$the_query = new WP_Query($args);
?>
<?php if ($the_query->have_posts()) : ?>
<!-- pagination here -->
<!-- the loop -->
<?php
while ($the_query->have_posts()) : $the_query->the_post();
$images = get_post_meta(get_the_ID(), 'ptype_gallery_images');
if ($images) {
?>
<h4 class="pageTitle">
<?php the_title(); ?>
</h4>
<div class="photogallery-section">
<?php
echo '<div class=""></div><div class="productImages row">';
foreach ($images as $image) {
$thumb = wp_get_attachment_image_src($image, 'product_thumb');
$img = wp_get_attachment_image_src($image, 'full');
$attachment = get_post($image);
?>
<div class="grid2">
<div class="productImgBx">
<div class="productImg"><a data-fancybox="gallery" href="https://wordpress.stackexchange.com/questions/277398/<?php echo $img[0]; ?>"><img src="<?php echo $thumb[0]; ?>"/></a></div>
<div class="productImgTitle"><?php echo $attachment->post_content; ?></div>
</div>
</div>
<?php
}
echo '</div>';
?>
</div>
<?php } endwhile; ?>
<!-- end of the loop -->
<!-- pagination here -->
<?php wp_reset_postdata(); ?>
<?php else : ?>
<p><?php _e('Sorry, no products found.'); ?></p>
<?php endif; ?>
</div>
</div>
</div>
<?php get_footer(); ?>
Это мой шаблон страницы для отображения пользовательского типа записи на фронтэнде, но он не сортируется так, как на бэкэнде.
Пожалуйста, помогите мне.
Спасибо заранее.
Вы можете использовать хук pre_get_posts
и параметр order_by
класса WP_Query
.
Из плагина или functions.php активной темы, вот что-то похожее (непроверенный пример):
add_action( 'pre_get_posts', 'my_post_type_sort', 10, 1);
function my_post_type_sort( $query ) {
if ( is_admin || ! $query->is_main_query() ) {
return;
}
if ( $query->get('post_type') !== 'name_of_post_type' ) {
return;
}
$query->set('orderby', array( 'menu_order' => 'ASC') );
}
Ответ или решение
Вопрос о сортировке пользовательских типов записей в WordPress действительно важен с точки зрения удобства управления контентом как на бэкенде, так и на фронтэнде сайта. Прежде чем приступить к решению этой задачи, нужно учесть несколько ключевых аспектов работы с пользовательскими типами записей в WordPress, а также использование параметров сортировки в WP_Query.
Теория
WordPress предоставляет мощный инструмент для создания и управления пользовательскими типами записей, что позволяет расширять функциональность сайта далеко за пределы стандартных постов и страниц. В вашем случае используется пользовательский тип записи ptype_gallery
, который отображается в административной панели с возможностью сортировки по полю menu_order
. Однако, как часто бывает, сортировка, установленная в бэкенде, может не применяться автоматически на фронтэнде. Это требует определенной доработки кода. Для этого используется класс WP_Query, который предоставляет гибкие возможности выбора и сортировки записей на стороне фронтэнда.
Пример
В текущем коде на бекенде, вы успешно настроили пользовательский тип записи ptype_gallery
и добавили колонку для сортировки по menu_order
. Однако проблема заключается в отсутствии соответствующей логики сортировки на фронтэнде.
Вот пример, как вы можете использовать экшн pre_get_posts
для изменения порядка отображения записей на фронтэнде:
add_action('pre_get_posts', 'my_custom_order_for_gallery');
function my_custom_order_for_gallery($query) {
if (!is_admin() && $query->is_main_query() && is_post_type_archive('ptype_gallery')) {
// Устанавливаем сортировку по menu_order в порядке возрастания
$query->set('orderby', 'menu_order');
$query->set('order', 'ASC');
}
}
Этот код проверяет, выполняется ли запрос на фронтэнде (не в админке), является ли он основным запросом и относится ли он к архиву ваших пользовательских записей ptype_gallery
. Если эти условия выполняются, то сортировка устанавливается по menu_order
в порядке возрастания.
Применение
Теперь, когда у вас есть пример кода, важно интегрировать его в тему или плагин вашего сайта. Для этого добавьте указанный код в файл functions.php
вашей активной темы или создайте отдельный плагин для этой цели. Это позволит сохранить логику сортировки даже при обновлении темы.
Также важно учесть, что вы можете изменить порядок сортировки. Например, сменив ‘ASC’ на ‘DESC’, вы получите убывающий порядок сортировки. Более того, если вы хотите предоставить пользователям возможность выбора порядка сортировки на фронтэнде, можно разработать дополнительный интерфейс на сайте, например, выпадающее меню или переключатель, который будет передавать нужное значение параметру order
через URL или формы.
В заключение, сортировка записей на фронтэнде по параметрам, установленным в бэкенде, требует небольших вмешательств в код вашего сайта. Однако такие изменения значительно увеличивают гибкость и удобство использования вашего сайта. Важно помнить о том, что малейшие изменения на фронтэнде могут быть восприняты пользователями как значительное улучшение функциональности, что, в свою очередь, положительно скажется на восприятии вашего веб-ресурса.