Взаимное связывание записей в WordPress: предыдущие записи из категории

Взаимное связывание записей в WordPress (предыдущие записи из категории)

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

Что делает эта функция

Одной из особенностей этой функции яв��яется то, что она показывает предыдущие записи из категории текущей записи.

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

Я также опубликовал аналогичную функцию в комментариях на сайте Dimox.name. Почему "аналогичная"? Потому что эта функция имеет несколько преимуществ:

  1. Настраиваемый формат вывода — это упрощает интеграцию в любой шаблон.
  2. Автоопределение категории — не требуется заранее указывать текущую категорию, это упрощает код и делает его доступным для новичков.
  3. Легкость работы — функция не использует тяжелую функцию WordPress get_posts().
  4. Стиль списка — каждая метка ссылки получает классы li1 и li2, что упрощает стилизацию в "зебровом" стиле.
  5. Кэширование — можно включить кэширование. Подробнее об этом ниже.
  6. Сортировка по дате — записи сортированы по дате, поэтому запись, опубликованная позже, будет отображаться первым.

Как использовать функцию

Вот код, который нужно вставить в файл вашего шаблона functions.php.

<?php
/**

  • Предыдущие записи из категории (относительно текущей записи) + взаимное связывание
  • Параметры, передаваемые в функцию. По умолчанию указаны значения в скобках.
  • @param int $post_num (5) Количество ссылок.
  • @param string $format ('') Формат вывода: {thumb} {date:j.M.Y} - {a}{title}{/a} ({comments}).
  • @param string $cache ('') Включить кэш (по умолчанию отключен). Напишите 1 для включения.
  • @param string $list_tag (li) Метка списка.
  • @param string $post_type (post) Тип поста, с которым мы работаем.
  • @param bool $echo (true) Вывод на экран или возврат для обработки (false).
  • @version 1.1
    */
    function kama_previous_posts_from_cat( $args ){
    global $post, $wpdb;

    $args = (object) wp_parse_args( $args, [
    'post_num' => 5,
    'format' => '',
    'cache' => true,
    'list_tag' => 'li',
    'post_type' => 'post',
    'echo' => true,
    ] );

    $cache_key = md5( FUNCTION . $post->ID );
    $cache_flag = FUNCTION;

    if( $args->cache && $cache_out = wp_cache_get( $cache_key, $cache_flag ) ){
    if( $args->echo ){
    return print( $cache_out );
    }
    return $cache_out;
    }

    $cat = get_the_category( $post->ID );
    $cat_id = (int) $cat[0]->term_id;

    $sql_SELECT = "SELECT ID, post_title, post_date, comment_count, guid
    FROM $wpdb->posts p
    LEFT JOIN $wpdb->term_relationships rel ON (p.ID = rel.object_id)
    LEFT JOIN $wpdb->term_taxonomy tax ON (rel.term_taxonomy_id = tax.term_taxonomy_id)";

    $same_AND = $wpdb->prepare(
    "AND tax.term_id = %s AND tax.taxonomy = 'category' AND p.post_status = 'publish' AND p.post_type = %s",
    $cat_id, $args->post_type
    );

    // попытка получить предыдущие посты
    $sql = "$sql_SELECT WHERE p.ID < $post->ID $same_AND ORDER BY p.post_date DESC LIMIT " . (int) $args->post_num;

    $res = $wpdb->get_results( $sql );

    $count_res = count( $res );

    // если записи меньше, чем нужно, сделать второй запрос
    if( ! $res || $count_res < $args->post_num ){
    $exclude = array_merge( [ $post->ID ], wp_list_pluck( $res, 'ID' ) );
    $exclude = implode( ',', array_map( 'intval', $exclude ) );

    $post_num = (int) $args->post_num - $count_res;
    
    $sql = "$sql_SELECT WHERE p.ID NOT IN ($exclude) AND p.ID != {$post->ID} $same_AND
    ORDER BY p.post_date DESC LIMIT " . (int) $post_num;
    
    $res2 = $wpdb->get_results( $sql );
    
    $res = array_merge( $res, $res2 );

    }

    if( ! $res ){
    return false;
    }

    // вывод

    if( $args->format ){
    preg_match( '!{date:(.*?)}!', $args->format, $date_m );
    }

    $add_thumb = ( false !== strpos( $args->format, '{thumb}' ) );

    $out = $x = '';
    foreach( $res as $pst ){
    $x = ( $x === 'li1' ) ? 'li2' : 'li1';
    $a1 = '';
    $a2 = "
    ";

    if( $args->format ){
        $date = apply_filters( 'the_time', mysql2date( $date_m[1], $pst->post_date ) );
        $com_count = $pst->comment_count ?: '';
    
        $formatted = strtr( $args->format, [
            $date_m[0] => $date,
            '{title}' => esc_html( $pst->post_title ),
            '{a}' => $a1,
            '{/a}' => $a2,
            '{comments}' => $com_count,
        ]);
    
        // если миниатюра существует
        if( isset( $add_thumb ) ){
            $thumb = get_the_post_thumbnail( $pst->ID, 'thumbnail' );
            $formatted = str_replace( '{thumb}', $thumb, $formatted );
        }
    }
    else{
        $formatted = $a1 . esc_html( $pst->post_title ) . $a2;
    }
    
    $out .= apply_filters( 'kama_previous_posts_from_cat__append_out',
        "n<$args->list_tag class="$x">$formattedlist_tag>",
        $args, $formatted, $x, $pst
    );

    }

    if( $args->cache ){
    wp_cache_add( $cache_key, $out, $cache_flag );
    }

    if( $args->echo ){
    return print $out;
    }

    return $out;
    }

После успешного копирования кода в файл шаблона functions.php, где вы хотите отображать предыдущие записи из текущей категории, вызовите функцию следующим образом:

Теперь вы знаете, как просто использовать эту функцию.

Важно! Этот вызов будет работать правильно только в файле темы, который отвечает за отображение записей, обычно это single.php.

Расширенное использование

Настройка формата вывода

Вы можете использовать следующие коды в параметре format:

  • {thumb} — миниатюра записи (она должна быть установлена для записи);
  • {comments} — покажет количество комментариев для статьи;
  • {title} — заголовок статьи;
  • {date:j.M.Y} — дата в формате "дд.Месяц.Гг" (например, "11.Апр.2010");
  • {a} и {/a} — теги ссылки, открывающий и закрывающий.

Вызов будет выглядеть так:

    5,
    'format' => '{a}{title}{/a} - {date:j.M.Y} // {comments}',
    ) );
    ?>

Это выведет список в формате:

  • Название статьи - дат�� // количество комментариев
  • Использование кэша

    Кэширование включено по умолчанию, и вы получите от него пользу, если функция вызывается несколько раз или если включен плагин кэширования объектов.

    Метка списка

    Вы можете изменить метку списка с li на любую другую, например, <div>:

    <?php kama_previous_posts_from_cat('post_num=5&list_tag=div'); ?>

    Это выведет 5 ссылок в формате: <div class='li1'><a href='http://link' title='Название статьи'>Название статьи</a></div>.

    Изменения

    Версия 1.0:

    • Добавлен шорткод {thumb} в параметр format.
    • Теперь все аргументы передаются в первый параметр функции в виде массива или строки.

    Leave a Reply

    Ваш адрес email не будет опубликован. Обязательные поля помечены *