johnthomas
  • 0
Новичок

Получение заголовков следующей и предыдущей записи на боковой панели?

  • 0

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

  • PostA (присвоен ‘категории 1’)
  • PostX ( категория 2 )
  • PostB (категория 1)
  • PostC ( категория 1 )
  • PostD (категория 1)
  • PostY ( категория 2 )
  • PostE (категория 1)

Когда посетитель будет читать PostC, как я могу отобразить на боковой панели:


Предыдущие сообщения:

‘PostA’ (здесь, конечно, ссылки)

‘PostB’

Следующие сообщения:

‘PostD’

‘PostE’


IOW предыдущие и следующие 2 сообщения из той же категории. (Если у поста больше категорий, мы выберем 1-ю или последнюю — это не имеет большого значения).

Кроме того, если невозможно отобразить два предыдущих и следующих сообщения, допустимо также только одно предыдущее и следующее сообщение. (Я знаю, что для этого есть некоторые функции WP, но мы предпочитаем, если это возможно, два поста).

Также, конечно, мы хотим отобразить первые n символов из названия (скажем, 22). Мы не хотим отображать статический текст, такой как «Следующая запись» или аналогичный.

ТИА

Share
  1. Существующие функции WordPress предназначены только для отображения одного предыдущего или следующего сообщения. Я быстро написал функции для отображения любого количества постов.

    Вставьте следующее в файл functions.php вашей темы:

    function custom_get_adjacent_posts( $in_same_cat = false, $previous = true, $limit = 2 ) {
        global $post, $wpdb;
    
        $op = $previous ? '<' : '>';
    
        if ( $in_same_cat ) {
            $cat_array = wp_get_object_terms($post->ID, 'category', array('fields' => 'ids'));
    
            $join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = 'category' AND tt.term_id IN (" . implode(',', $cat_array) . ")";
        }
    
        $posts = $wpdb->get_results( $wpdb->prepare( "SELECT p.* FROM wp_posts AS p $join WHERE p.post_date $op '%s' AND p.post_type = 'post' AND p.post_status = 'publish' ORDER BY p.post_date DESC LIMIT $limit", $post->post_date, $post->post_type ) );
    
        return $posts;
    }
    
    function custom_adjacent_posts_links( $in_same_cat = false, $previous = true, $limit = 2 ) {
        $prev_posts = custom_get_adjacent_posts( $in_same_cat, $previous, $limit );
        if( !empty($prev_posts) ) {
            echo ($previous) ? '<h3>Previous Posts:</h3>' : '<h3>Next Posts:</h3>';
            echo '<ul>';
            foreach( $prev_posts as $prev_post ) {
                $title = apply_filters('the_title', $prev_post->post_title, $prev_post->ID);
                echo '<li><a href="' . get_permalink( $prev_post ) . '">' .$title . '</a></li>';
            }
            echo '</ul>';
        }
    }
    

    В файле боковой панели, где вы хотите отображать сообщения, используйте custom_adjacent_posts_links( true ); для отображения двух предыдущих сообщений в той же категории и custom_adjacent_posts_links( true, false ); для отображения следующих двух сообщений в той же категории.

    • 0
    • Хороший! У меня была идея отфильтровать запрос get_adjacent_post(), чтобы увеличить количество возвращаемых сообщений, но он жестко закодирован для get_row метода и возвращает только одно сообщение, даже если из базы данных возвращается больше результатов.

      • 0
    • Ага. Большое спасибо! Просто примечание: возможно, лучше использовать виджет кода PHP для внедрения вызовов, чтобы отделить наш пользовательский код от кода шаблона. Мы используем Executable PHP Code виджет, и он прекрасно работает. В любом случае принятый ответ.

      • 0

Оставить ответ

You must login to add an answer.