Как вывести записи в WordPress в произвольном порядке

Пробовали ли вы когда-либо изменить стандартный порядок вывода постов на странице блога? По умолчанию записи упорядочиваются на основе даты публикации, и нет никакого простого способа изменить порядок их вывода.

blogord

Если вы хотите изменить порядок вывода записей, у вас есть три варианта: изменить дату публикации записи, написать некоторый код для сортировки записи с помощью параметров, отличных от даты публикации, либо найти плагин, который сделает всю работу за вас.

Смена даты публикации – не самый лучший подход для большинства блогов. Таким образом, в данной статье мы рассмотрим второй и третий вариант. Для начала я покажу вам, как написать плагин для применения произвольного порядка вывода записей. Затем мы рассмотрим два плагина из хранилища WordPress, которые мы будем использовать для создания произвольного порядка вывода записей.

Пишем свой плагин для вывода записей

Есть два основных шага, которые необходимы для реализации своего порядка вывода записей:

  1. Добавить произвольное поле, которое будет использоваться в качестве основы для сортировки постов.
  2. Реализовать произвольный порядок сортировки, изменив основной цикл WordPress или создав произвольный цикл и добавив его к специальному шаблону страниц или в виджет сайдбара.

Давайте начнем с добавления произвольного поля, что делается на экране редактирования записей WordPress. Однако перед тем как сделать это, вам нужно будет включить среду разработки, создать папку с плагином, после чего создать файл плагина в этой папке. Если вы хотите узнать, как выглядит структура плагина, вы можете видеть готовый продукт на GitHub.

Создаем произвольное поле

Вы можете использовать произвольные поля на экране редактирования записей, чтобы добавить метаданные к каждой записи, однако я предпочитают добавлять произвольную мета-панель с полем к бэкэнду. Благодаря этому вы сможете избежать случайного внесения метаданных в неверное поле.

Первый шаг для добавления произвольной мета-панели к бэкэнду – это создание панели и привязка ее к экрану редактирования записей:

<?php
/* Create custom meta data box to the post edit screen */
function jpen_custom_post_sort( $post ){
  add_meta_box( 
    'custom_post_sort_box', 
    'Position in List of Posts', 
    'jpen_custom_post_order', 
    'post' ,
    'side'
    );
}
add_action( 'add_meta_boxes', 'jpen_custom_post_sort' );
?>

Данный фрагмент кода, включенный в файл вашего плагина, позволит создать произвольную мета-панель. Вот как будет выглядеть панель:

custom-sort-box-1

Вы можете заметить функцию обратного вызова ‘jpen_custom_post_order’ в коде. Давайте создадим эту функцию далее и добавим ее в файл нашего плагина. Она будет вносить поле в мета-панель, которую мы создали выше.

<?php
/* Add a field to the metabox */
function jpen_custom_post_order( $post ) {
  wp_nonce_field( basename( __FILE__ ), 'jpen_custom_post_order_nonce' );
  $current_pos = get_post_meta( $post->ID, '_custom_post_order', true); ?>
  <p>Enter the position at which you would like the post to appear. For exampe, post "1" will appear first, post "2" second, and so forth.</p>
  <p><input type="number" name="pos" value="<?php echo $current_pos; ?>" /></p>
  <?php
}
?>

Фрагмент кода начинается с задания одноразовых чисел (nonces). Затем мы создаем переменную $current_pos и присваиваем ей значение текущего порядка сортировки записей. Далее идут два элемента p, которые создают видимый контент мета-панели. Затем текущее значение, если оно существует, выводится в поле.

Наконец, нам нужно сохранить пользовательский ввод в базу данных. Мы сделаем это, добавив следующий код к плагину:

<?php
/* Save the input to post_meta_data */
function jpen_save_custom_post_order( $post_id ){
  if ( !isset( $_POST['jpen_custom_post_order_nonce'] ) || !wp_verify_nonce( $_POST['jpen_custom_post_order_nonce'], basename( __FILE__ ) ) ){
    return;
  } 
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ){
    return;
  }
  if ( ! current_user_can( 'edit_post', $post_id ) ){
    return;
  }
  if ( isset( $_REQUEST['pos'] ) ) {
    update_post_meta( $post_id, '_custom_post_order', sanitize_text_field( $_POST['pos'] ) );
  }
}
add_action( 'save_post', 'jpen_save_custom_post_order' );
?>

Здесь мы сначала проверяем задание одноразовых чисел, после чего выполняем проверку пользовательских полномочий для внесения изменений в запись. Если проверка прошла успешно, метаданные записи обновляются – в них заносится новое значение произвольного порядка вывода записей.

Выводим произвольное поле в панели администратора

В прошлом разделе мы добавили произвольную мета-панель к экрану редактирования записей – она будет хранить числовое значение. Чуть позже мы будем использовать это числовое значение для создания своего порядка вывода записей. Однако нам нужно решить еще одну проблему перед этим.

Чтобы увидеть значение порядка сортировки записей для текущей записи, мы должны открыть эту запись и взглянуть в произвольную мета-панель, добавленную нами к экрану редактирования записей. Это не очень удобно. Давайте добавим значение порядка сортировки на страницу вывода записей в панели администратора, чтобы мы могли быстро увидеть значение, связанное с каждой записью.

Во-первых, нам нужно добавить произвольный столбец к списку записей в области администратора. Мы сделаем это при помощи следующего кода:

<?php
/* Add custom post order column to post list */
function jpen_add_custom_post_order_column( $columns ){
  return array_merge ( $columns,
    array( 'pos' => 'Position', ));
}
add_filter('manage_posts_columns' , 'jpen_add_custom_post_order_column');
?>

Затем нам нужно получить значение порядка вывода записей для каждой записи и вывести это значение в новом столбце. Это не так сложно, и мы сделаем это с помощью следующей функции:

<?php
/* Display custom post order in the post list */
function jpen_custom_post_order_value( $column, $post_id ){
  if ($column == 'pos' ){
    echo '<p>' . get_post_meta( $post_id, '_custom_post_order', true) . '</p>';
  }
}
add_action( 'manage_posts_custom_column' , 'jpen_custom_post_order_value' , 10 , 2 );
?>

Прекрасно. Теперь, если мы посетим список записей блога в панели администратора, мы сможем легко увидеть, каким записям был присвоен новый порядок вывода.

Вот как это будет выглядеть в панели администратора:

list-of-posts-with-position

Способы использования произвольного порядка вывода записей

Теперь, когда мы реализовали возможность привязки произвольного порядка вывода к записям, пришла пора найти достойное применение этой опции. Нам нужно ответить на вопрос: «Как именно мы хотим использовать произвольный порядок вывода записей?»

Есть несколько разных вариантов, как можно применить произвольную сортировку. Вот пара идей:

  • Сортировать все записи в произвольном порядке и выводить отсортированный список на странице записей блога. Вряд ли вы захотите делать это на активно пополняемом блоге, однако если вы используете WordPress для публикации серии учебных руководств, которые обновляются не так часто, вы можете прибегнуть к сортировке записей в произвольном порядке.
  • Создать курируемый список записей и выводить эти записи в любом удобном порядке с помощью произвольных шаблонов страниц. К примеру, вы можете создать список, в котором будут присутствовать только записи из определенной категории, и сортировать эти записи в любом удобном порядке.
  • Создать список записей блога, который будет начинаться с нескольких произвольно отсортированных записей, после чего будут включены остальные посты в обычном порядке.

Никаких пределов нет. Если вы нашли применение произвольному порядку вывода записей и знаете, как это реализовать – отлично! Давайте рассмотрим все три идеи, изложенные выше, чтобы понять, как они будут выполняться на практике.

Меняем записи на странице блога на произвольно отсортированный список

Самый простой способ использования произвольного порядка вывода записей – замена стандартного списка записей на странице блога на произвольно отсортированный список. Чтобы сделать это, вы должны поместить следующую функцию в ваш плагин:

<?php
/* Sort posts on the blog posts page according to the custom sort order */
function jpen_custom_post_order_sort( $query ){
  if ( $query->is_main_query() && is_home() ){
    $query->set( 'orderby', 'meta_value' );
    $query->set( 'meta_key', '_custom_post_order' );
    $query->set( 'order' , 'ASC' );
  }
}
add_action( 'pre_get_posts' , 'jpen_custom_post_order_sort' );
?>

Имейте в виду, что эта функция будет включать только записи, которые были связаны со значением произвольного порядка вывода. Все остальные записи без такой привязки не будут выводиться на странице блога. Иными словами, если вы сделаете это, вам нужно будет привязывать значение произвольного порядка вывода ко всем записям, которые должны быть выведены на экран.

Создаем курируемый список произвольно отсортированных записей

Создание курируемого списка произвольно отсортированных записей требует использования класса WP_Query. Вам нужно будет создать запрос, включающий параметр, который вы хотите использовать для внесения записи в список, после чего вам нужно будет добавить произвольный порядок сортировки к запросу. Вот как будет выглядеть код:

<?php
$args = array(
  'post_type' => 'post',
  'cat' => '94',
  'meta_key' => '_custom_post_order',
  'orderby' => 'meta_value',
  'order' => 'ASC'
);
$query = new WP_query ( $args );
if ( $query->have_posts() ) {
  while ($query->have_posts() ) {
    $query->the_post();
    /* only list posts that have a current custom post order value */
    if ( !empty(get_post_meta( $post->ID, '_custom_post_order', true )) ) : ?>

    /* insert code for rendering posts */

<?php 
    endif; }
  wp_reset_postdata();
} ?>

Этот запрос сначала отберет все записи, которые принадлежат к категории с ID = 94. Далее он будет отбирать записи, которые имеют значение произвольного порядка вывода. Наконец, он отсортирует эти записи в нужном порядке.

Данный запрос может быть помещен в произвольный шаблон страницы или добавлен к виджету сайдбара для вывода запрашиваемых записей.

Добавляем отсортированные записи в начало списка записей блога

Еще один вариант реализации сортировки – добавление произвольно отсортированных записей в начало списка записей блога, после чего уже пойдут остальные записи блога, сортируемые в обычном порядке. Сделать это будет сложнее – нам понадобится создать два произвольных запроса с помощью класса WP_Query.

Первый запрос получит произвольно отсортированные записи и выведет их в соответствии со значением сортировки. Однако нам нужно, чтобы список произвольно отсортированных записей был представлен только на первой странице блога, поэтому нам нужно будет добавить также условие if, которое будет проверять, является ли страница первой.

Второй запрос получит все записи и отсортирует их в обычном порядке. Однако он пропустит все те записи, к которым присвоено произвольное значение сортировки. Чтобы включить пагинацию для записей, полученных во втором запросе, нам нужно будет поработать с глобальной переменной $wp_query.

Вот один из способов, которым мы могли бы объединить два запроса для получения желаемого результата:

<?php
/*  
 *  First Loop 
 *  Returns posts with a custom post order value
 */
// First, determine if on the first page of posts
// If on first page, run query to display posts with custom sort first
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if(1 == $paged) :
  $args1 = array(
    'post_type' => 'post',
    'meta_key' => '_custom_post_order',
    'orderby' => 'meta_value',
    'order' => 'ASC'
  );
  $query1 = new WP_query ( $args1 );
  if ( $query1->have_posts() ) :
    while ($query1->have_posts() ) :
      $query1->the_post(); 
      // This if statement will skip posts that were assigned a custom sort value and then had that value removed 
      if ( !empty(get_post_meta( $post->ID, '_custom_post_order', true )) ) :
        // Display the custom sorted posts ?>
        <div>
        <?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
        <?php the_excerpt(); ?>
        <a href="<?php the_permalink(); ?>">Read More</a>
        </div>
        <hr>
        <!--insert additional code for rendering posts--><?php
 
      endif; // End displaying custom sorted posts
    endwhile; // End looping through custom sorted posts
  endif; // End loop 1
  wp_reset_postdata(); // Set up post data for next loop
endif; // End checking for first page
/*  
 *  Second Loop 
 *  Returns all posts except those in the list above
 */
$args2 = array(
  'post_type' => 'post',
  'orderby' => 'date',
  'order' => 'DESC',
  'paged' => $paged
);
// For pagination to work, must make temporary use of global $wp_query variable
$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_query ( $args2 );
if ( $wp_query->have_posts() ) :
  while ($wp_query->have_posts() ) :
    $wp_query->the_post();
      // Skip posts with custom sort value
      if ( !empty(get_post_meta( $post->ID, '_custom_post_order', true )) ) { continue; }
      // Display the standard sorted posts ?>
      <div>
      <?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
      <?php the_excerpt(); ?>
      <a href="<?php the_permalink(); ?>">Read More</a>
      </div>
      <hr>
      <!--insert additional code for rendering posts--><?php
    
  endwhile; // End looping through standard sorted posts
endif; // End loop 2
wp_reset_postdata();
// Pagination functions would go here
// Reset global $wp_query variable to its original state
$wp_query = null;
$wp_query = $temp;
?>

Вы можете использовать этот набор запросов, чтобы заменить стандартный запрос для страницы блога. Делается это в три шага:

  1. Создаем файл home.php, копируя Index.php родительской темы.
  2. Помещаем эти запросы вместо базового цикла.
  3. Загружаем новый home.php в корневую директорию дочерней темы.

Теперь при отображении страницы блога будет использоваться новый файл home.php в качестве шаблона страницы.

Плагины для достижения тех же целей

Если вы не разработчик или же вам не требуется гибкость произвольных решений, вы можете воспользоваться несколькими плагинами, которые доступны в каталоге плагинов WordPress.org. С их помощью вы сможете облегчить сортировку записей. Однако многие из доступных решений плохо поддерживаются или нерегулярно обновляются. Давайте рассмотрим два варианта, которые активно поддерживаются их разработчиками и имеют регулярные обновления.

Post Types Order

pto

Post Types Order активен на более чем 400 000 сайтов, постоянно обновляется; разработчик активно решает вопросы, поступающие в поддержку. Плагин имеет рейтинг 4,6 из 5 и собрал более 150 отзывов от пользователей.

Плагин может использоваться для произвольной сортировки записей и типов записей. Чтобы использовать плагин, просто установите и активируйте его, после чего перейдите в раздел Settings > Post Types Order. Далее посетите список записей в панели администратора и просто перетащите записи в требуемый раздел с порядком сортировки. В итоге вы увидите, что записи во фронтэнде вашего сайта были отсортированы в нужном вам порядке.

Order Your Posts Manually

orde

Order Your Posts Manually активен менее чем на 1000 сайтов WordPress. Однако он имеет хороший рейтинг, равный 4,6 из 5, и разработчики решают все запросы, поступающие в поддержку. Плагин действительно стоит рассмотрения.

Чтобы использовать плагин, установите его, активируйте и перейдите в раздел Settings > Order Your Posts Manually. Настройте несколько опций и щелкните Order My Posts. Щелчок по этой кнопке перенесет вас в раздел Tools > Order Your Post Manually и сгенерирует список всех ваших записей. Просто перетащите ваши записи в нужную группу, чтобы упорядочить их, после чего щелкните по Save Changes.

Источник: wpmu.org

Блог про WordPress
Комментарии: 3
  1. Даша

    Спасибо большое за познавательный и полезный материал! Респект!

  2. Novinki

    Post Types Order — то, что нужно.

  3. Андрей

    Благодарю за разбор всех решений по данной теме. Взял в копилку.

Добавить комментарий

Получать новые комментарии по электронной почте.