0

すべての投稿を一覧表示するメインのブログがあります。

1つのカテゴリの投稿のみを一覧表示するカテゴリページもあります。

メインブログ

  • 投稿#1
  • 投稿#2
  • 投稿#3
  • 投稿#4
  • 投稿#5

カテゴリAページ

  • 投稿#1
  • 投稿#3
  • 投稿#4

カテゴリBページ

  • 投稿#1
  • 投稿#3
  • 投稿#5

ユーザーがクリックして投稿を表示し、デフォルトのnext / prevリンク機能を使用する場合、WordPressが次にどの投稿を表示するかを知る方法はありません。

たとえば、ユーザーが投稿#3を見ている場合、次の投稿は#4または#5にする必要がありますか?それはすべて、ユーザーがどこから来たかによって異なります。

そこで、この問題に答えるために次のコードを書き、共有したいと思いました。

4

1 に答える 1

0

注:特に何千もの投稿がある場合、これがこれを行うための最も効率的な方法ではないことを私は知っています。次の投稿を取得するためのより良い方法を見つけたいと思います。

以下をfunctions.phpファイルに追加します。

/*
 * Session Tracking
 */    
    add_action('init', 'start_session', 1);
    function start_session() {
        if(!session_id()) {
            session_start();       
        }
    }
    // Update Cookie trail
    function update_cookie_trail() {
        $_SESSION['ref_category'] = get_query_var('cat');
    }


/*
 * Return next post based off of cookies
 */
    function next_post_from_session($text, $categories) {
        global $post;

        $cat_array = explode(',', $categories);
        $cat_array[] = $_SESSION['ref_category'];

        // Get all posts, exclude Hidden cat
        $args = array(
            'numberposts'     => -1,
            'category'        => implode(',', $cat_array),
            'orderby'         => 'post_date',
            'order'           => 'DESC',
            'post_type'       => 'post',
            'post_status'     => 'publish',
        );
        $allPosts = get_posts( $args );
        $index = 0;

        foreach( $allPosts as $thePost ) {
            $index++;
            if($post->ID == $thePost->ID) {
                $nextPost = $allPosts[$index++];
                $url = get_permalink($nextPost->ID);
                $a = '<a href="'.$url.'" title="'.esc_attr($nextPost->post_title).'" />'.$text.'</a>';
                return $a;
            }
        }
    }

/*
 * Return previous post based off of cookies
 */
    function previous_post_from_session($text, $categories) {
        global $post;

        $cat_array = explode(',', $categories);
        $cat_array[] = $_SESSION['ref_category'];

        // Get all posts, exclude Hidden cat
        $args = array(
            'numberposts'     => -1,
            'category'        => implode(',', $cat_array),
            'orderby'         => 'post_date',
            'order'           => 'DESC',
            'post_type'       => 'post',
            'post_status'     => 'publish',
        );
        $allPosts = get_posts( $args );
        $index = 0;

        foreach( $allPosts as $thePost ) {
            if($post->ID == $thePost->ID) {
                $prevPost = $allPosts[$index-1];
                $url = get_permalink($prevPost->ID);
                $a = '<a href="'.$url.'" title="'.esc_attr($prevPost->post_title).'" />'.$text.'</a>';
                return $a;                
            }
            $index++;
        }
    }


/*
 * Generate a "back" URL to the previous category page based off session data
 */
    function previous_category_permalink() {
        $ref_url = $_SESSION['ref_category'];
        return get_category_link($ref_url);
    }

次に、いくつかのブログ投稿(「関連する投稿」セクションなど)を表示するcategory.phpまたはページで、次の関数を実行します。

update_cookie_trail();

次に、single.phpで次の関数を使用できます。

<?php echo next_post_from_session('Next', '-24, 10'); ?>

<a class="close" href="<?php echo previous_category_permalink(); ?>">
    Back
</a>                      

<?php echo previous_post_from_session('Previous Post', '-24, 10'); ?>

'-24、10'は、コンマ区切りのIDを使用してカテゴリを除外したり、具体的に含めたりできるパラメータです。

于 2012-12-19T06:06:42.230 に答える