web-dev-qa-db-ja.com

Get_previous_post()をネストすることは可能ですか?

前の投稿と2番目の投稿のおすすめ画像、および次の2つの投稿の注目画像を取得しようとしています。

<div id="cooler-nav" class="navigation row">
<?php $prevPost = get_previous_post(true);
    if($prevPost) {?>
    <div class="nav-box previous col-md-3">
    <?php $prevthumbnail = get_the_post_thumbnail($prevPost->ID, array('medium'));}?>
    <?php previous_post_link('%link',"$prevthumbnail  %title", TRUE); ?>
    </div>

<?php $prevprevPost = get_previous_post(get_previous_post(true));
    if($prevprevPost) {?>
    <div class="nav-box previous col-md-3">
    <?php $prevprevthumbnail = get_the_post_thumbnail($prevprevPost->ID, array('medium'));}?>
    <?php previous_post_link('%link',"$prevprevthumbnail  %title", TRUE); ?>
    </div>

<?php $nextPost = get_next_post(true);
    if($nextPost) { ?>
    <div class="nav-box next col-md-3">
    <?php $nextthumbnail = get_the_post_thumbnail($nextPost->ID, array('medium') ); } ?>
    <?php next_post_link('%link',"$nextthumbnail  %title", TRUE); ?>
    </div>

<?php $nextnextPost = get_next_post(get_next_post(true));
    if($nextnextPost) {?>
    <div class="nav-box next col-md-3">
    <?php $nextnextthumbnail = get_the_post_thumbnail($nextnextPost->ID, array('medium'));}?>
    <?php next_post_link('%link',"$nextnextthumbnail  %title", TRUE); ?>
    </div>
</div><!--#cooler-nav div -->

次と前のリンクの代わりに、周囲の投稿の4つの特集画像を表示したいと思います。

1
HannesH

私が以前コメントで言ったように

get_previous_post()get_next_post()に無効な値を使用しています。あなたはここであなた自身の関数を書く方がましだ。

私は以下のことを思いつきました。 :

  • すべての投稿の配列を取得して現在の投稿の位置を特定します。

  • 現在の投稿の両側にある投稿の投稿IDを取得します。 IDの量は$x_from_currentで設定された値によって異なります。現在のデフォルトは1です。つまり、現在の投稿の横にあるIDを取得します。 2に設定すると、現在の投稿の横にある2つの投稿を取得します。

  • 現在の投稿と同じ用語から次/前の投稿を取得するように関数を設定することもできます。それから分類法を設定することを忘れないでください。これはデフォルトでcategoryです

サムネイルを表示する必要があるので、隣接する投稿の投稿IDのみを返すことにしました。その場合は、投稿IDのみが必要になります。

これが機能です。この機能がどのように機能し、どのように使用されるかを理解できるように、私はそれをよくコメントしました

function get_x_post_from_current( $x_from_current, $in_same_term, $taxonomy, $previous ) {

    // Get the current single post ID. To be save, use get_queried_object_id()
    $current_post_id = get_queried_object_id();

    // Option to choose if adjacent posts should be from the same term. Should then set $taxonomy
    if( true === $in_same_term ) {

        /**
         * Use wp_get_post_terms() to retrieve the terms/categories the current post belongs
         * to
         *
         * @see http://codex.wordpress.org/Function_Reference/wp_get_post_terms
         *
        */ 
        $terms = wp_get_post_terms( $current_post_id, $taxonomy, ['fields' => 'ids'] );

        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){

        /**
         * Use tax_query to retrieve a list of posts from the same term as the current post.
         * To speed up the query, get only post ID's. We don't need any other field's info
         *
         * @see http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
        */ 
        $args = [
            'posts_per_page' => -1,
            'fields' => 'ids',
            'tax_query' => [
                [
                    'taxonomy' => $taxonomy,
                    'field' => 'term_id',
                    'terms' => $terms[0],
                    'include_children' => false,
                ]
            ]       
        ];

        }

    }else{

        // Default if $in_same_term is false
        $args = [
            'posts_per_page' => -1,
            'fields' => 'ids'
        ];

    }

    $q = new WP_Query( $args );

    // Get the current post position. Will be used to determine adjacent posts
    $current_post_position = array_search( $current_post_id, $q->posts );

    /**
     * Previous posts = Newer posts
     * Next Posts = Older posts
     *
     * If $previous is true, reverse array, use array_slice to get the desired amount 
     * of ID's on the left of the current post. Reverse that array to keep synchronous order
     *
     * If $previous is false, slice the array to the right of the current post
     *
    */ 
    if( true === $previous ) {

        $reverse_position   = count( $q->posts ) - ( $current_post_position + 1 );
        $array_reverse      = array_reverse( $q->posts );
        $keys   = array_slice( $array_reverse, $reverse_position + 1, $x_from_current );

    }else{

        $keys = array_slice( $q->posts, $current_post_position + 1, $x_from_current );

    }

    // Returns an array of post ID's or an empty string if no next/previous post is found
    return $keys;

}

// Get the previous post's ID's. Amount of ID's to retrieve is set by $x_from_current
function get_previous_x_post_id( $x_from_current = 1, $in_same_term = false, $taxonomy = 'category' ) {

    return get_x_post_from_current( $x_from_current,$in_same_term, $taxonomy, true );

}

// Get the next post's ID's. Amount of ID's to retrieve is set by $x_from_current
function get_next_x_post_id( $x_from_current = 1, $in_same_term = false, $taxonomy = 'category' ) {

    return get_x_post_from_current( $x_from_current,$in_same_term, $taxonomy, false ); 

}

これがあなたがsingle.phpの中の関数をどのように使うべきかということです。あなたの場合は、両側に2本の投稿が必要です(次/前の投稿)

$previous_posts = get_previous_x_post_id( 2 ); 
?><pre><?php var_dump($previous_posts); ?></pre><?php // Just to see the output 

if( $previous_posts ) {

    foreach ( $previous_posts as $previous_post ) {

        // $previous_post holds the post ID. Use $previous_post to return the post thumbnail

        //Get the post title
        $get_post = get_post( $previous_post );
        echo apply_filters( 'the_title', $get_post->post_title ); 

     }

}

次の投稿についても同じようにします。

これは最小限です。あなたが合うようにそれを拡張することができます。こちらの記事を見てみることもできます私は最近しました。これは、必要に応じて参照元と複数の投稿タイプを使用する、非常に広範な単一投稿ページ付け機能です。あなたは非常に簡単にそこにこの機能を構築することができます

コメントの編集

たとえば、1,2,4,5のように左から右に並べます。しかし今、それは2,1,5,4で注文されています、そして私はそれらを好転させたくありません

元のコードでは、何らかの理由で、以前の投稿に対して返された投稿IDの配列を元に戻しました。これは現在修正されています(または知識によると、残念ながら現在何もテストできません)。

サムネイルの下にタイトルを追加したいのですが、フィールドをIDとタイトルに変更できますか。

投稿タイトルのみを返すオプションはありません。これを回避する最善の方法は、関数によって返される投稿IDを使用し、それらをget_postと共に使用して特定の投稿を取得し、そこから投稿のタイトルを使用することです。

全部の記事を全部検索する必要があるので、これに対応するために関数自体を変更するのは本当に費用がかかるでしょう。そしてもしあなたが1000の記事を持っているなら、あなたはタイムアウトの危険を冒します。これは迅速で、あまり高価ではないので、私はすべての投稿IDを取得するという考えを持って行きました。 4つの関連記事の情報を取得するには、4つの小さなdbクエリを作成することをお勧めします。

更新バージョンについては上記のコードを参照してください。

1
Pieter Goosen

コツは、この関数は current postに対してのみ機能することです。しかし、それはあなたが調整できることです。

そのため、原則として、このようなものは動作するはずです(テストされていません)。

global $post;
$post = get_next_post();
setup_postdata( $post ); // the next is now current
// do things
$post = get_next_post(); // and this time we got the next for next
// do more things
wp_reset_postdata(); // clean up when we are done
0
Rarst