web-dev-qa-db-ja.com

サイドバーに次の投稿と前の投稿のタイトルを取得する

私は以下のタイトルを持つ以下の投稿があるとしましょう。

  • PostA( 'カテゴリ1'に割り当てられています)
  • PostX(カテゴリ2
  • PostB(カテゴリ1)
  • PostC(カテゴリ1
  • PostD(カテゴリ1)
  • PostY(カテゴリ2
  • PostE(カテゴリ1)
    ...

訪問者がPostCを読むとき、サイドバーにどのように表示することができますか:


前の投稿:
'PostA'(これらはもちろんここにリンクです)
'PostB'

次の投稿:
'PostD'
'PostE'


同じカテゴリからの前後の2つの投稿を表示します。 (投稿にもっと多くのカテゴリがある場合は、最初のものか最後のものを選択します - それほど重要ではありません)。

また、前の記事と次の2つの記事を表示することが不可能な場合は、前後の記事も1つだけにしてもかまいません。 (私はこれにはいくつかのWP関数があることを知っていますが、可能であれば2つの投稿が望ましいです)。

また、もちろんタイトルの最初の 'n'文字を表示したいです(22としましょう)。 「次の投稿」などのような静的テキストは表示したくありません。

TIA

4
John Thomas

既存の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>';
    }
}

投稿を表示するサイドバーファイルで、同じカテゴリ内の前の2つの投稿を表示するにはcustom_adjacent_posts_links( true );を、同じカテゴリ内の次の2つの投稿を表示するにはcustom_adjacent_posts_links( true, false );を使用します。

3
sorich87