質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • PHP

    24449questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • HTML

    11803questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • WordPress

    9098questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • HTML5

    5247questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

WordPressでページネーションを表示させることができない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 395

makirons

score 10

実現したいこと

WordPressで閲覧履歴のリストを作成しているのですが、ページネーションが出力できません。

後述するコードは、<?php readpost_typecheack(100); ?>で閲覧履歴を100件出力し、それを15件ずつに分割してページネーションを付ける。という機能を実現せんとするものです。

このうち、15件ずつの分割についてはできているものの、「★ページネーション表示」と「★ページネーション出力関数」がうまくいかないという状況でございます。

該当のソースコード

/**
* 履歴の登録
*/
add_action( 'get_header', 'readpost');

function readpost() {
    global $browsing_histories;
    $browsing_histories = null;
    $set_this_ID = null;
    if( is_single() ){
        if( isset($_COOKIE['postid_history']) ){
            //cookieの値を呼び出し
            $browsing_histories = explode(",", $_COOKIE['postid_history']);
            if( $browsing_histories[0] != get_the_ID() ){
                if( count($browsing_histories) >= 50 ){
                    $set_browsing_histories = array_slice($browsing_histories , 0, 49);
                }else{
                    $set_browsing_histories = $browsing_histories;
                }
                //値の先頭が現在の記事IDでなければ文字列の一番最初に追加
                $set_this_ID = get_the_ID().','.implode(",", $set_browsing_histories);
                setcookie( 'postid_history', $set_this_ID, time() + 60 * 60 * 24 * 365 * 1,'/' );
                // }else{
                //     $set_this_ID = $_COOKIE['postid_history'];
            }
        }else{
            //cookieがなければ、現在の記事IDを保存
            $set_this_ID = get_the_ID();
            setcookie( 'postid_history', $set_this_ID, time() + 60 * 60 * 24 * 365 * 1,'/' );
        }
    //呼び出しのみ
    }else{
        if( isset($_COOKIE['postid_history']) ){
            $browsing_histories = explode(",", $_COOKIE['postid_history']);
        }
    }
    $postread = explode( ",", $_COOKIE['postid_history'] );
    $postread = array_unique( $postread );
    $postread = array_values( $postread );
    return $postread;
}

/**
* 履歴の出力(ご回答を受けてコードを修正致しました。)
*/
function readpost_typecheack( $postnum ) {
    $postdate = readpost();
    $numlist = 0;
    if( !empty($postdate) ): ?>
    <ul>
    <?php 
    $paged = get_query_var('paged') ?: 1;
    $args = array(
        'paged' => $paged,
        'posts_per_page' => 15,
        'post__in' => $postdate,
        'post_type' => 'mypost'
    );
    $the_query = new WP_Query( $args );

    if($postnum==$numlist){ break; }

    if ( $the_query->have_posts() ) :
        while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endwhile;
    endif;

    /* ページネーション表示 */
    if ( function_exists( 'pagination' ) ) :
        pagination( $the_query->max_num_pages, $paged );
    endif;

    wp_reset_postdata();?>
    </ul>
    <?php endif;
}    

/**
* ★ページネーション出力関数
* $paged : 現在のページ
* $pages : 全ページ数
* $range : 左右に何ページ表示するか
* $show_only : 1ページしかない時に表示するかどうか
*/
function pagination( $pages, $paged, $range = 2, $show_only = false ) {

    $pages = ( int ) $pages;    //float型で渡ってくるので明示的に int型 へ
    $paged = $paged ?: 1;       //get_query_var('paged')をそのまま投げても大丈夫なように

    //表示テキスト
    $text_first   = "« 最初へ";
    $text_before  = "‹ 前へ";
    $text_next    = "次へ ›";
    $text_last    = "最後へ »";

    if ( $show_only && $pages === 1 ) {
        // 1ページのみで表示設定が true の時
        echo '<div class="pagination"><span class="current pager">1</span></div>';
        return;
    }

    if ( $pages === 1 ) return;    // 1ページのみで表示設定もない場合

    if ( 1 !== $pages ) {
        //2ページ以上の時
        echo '<div class="pagination"><span class="page_num">Page ', $paged ,' of ', $pages ,'</span>';
        if ( $paged > $range + 1 ) {
            // 「最初へ」 の表示
            echo '<a href="', get_pagenum_link(1) ,'" class="first">', $text_first ,'</a>';
        }
        if ( $paged > 1 ) {
            // 「前へ」 の表示
            echo '<a href="', get_pagenum_link( $paged - 1 ) ,'" class="prev">', $text_before ,'</a>';
        }
        for ( $i = 1; $i <= $pages; $i++ ) {

            if ( $i <= $paged + $range && $i >= $paged - $range ) {
                // $paged +- $range 以内であればページ番号を出力
                if ( $paged === $i ) {
                    echo '<span class="current pager">', $i ,'</span>';
                } else {
                    echo '<a href="', get_pagenum_link( $i ) ,'" class="pager">', $i ,'</a>';
                }
            }

        }
        if ( $paged < $pages ) {
            // 「次へ」 の表示
            echo '<a href="', get_pagenum_link( $paged + 1 ) ,'" class="next">', $text_next ,'</a>';
        }
        if ( $paged + $range < $pages ) {
            // 「最後へ」 の表示
            echo '<a href="', get_pagenum_link( $pages ) ,'" class="last">', $text_last ,'</a>';
        }
        echo '</div>';
    }
}


長いコードで誠に恐れ入りますが、対処法について何かアドバイス頂戴できましたら幸甚に存じます。
識者の皆様、何卒宜しくお願い申し上げます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2018/11/29 03:03

    「うまくできない」とは「何をしたときに」「どうなると思って」「どうなったのか」を、出ているエラーなどと併せて、具体的に記述されたほうが回答を得られやすいと思います。

    キャンセル

  • makirons

    2018/11/30 18:20

    遅くなりまして申し訳ございません。不備についてのご指摘、誠にありがとうございます。主観的にはコメントアウントの部分で表現したつもりではありましたが、改めて考えると仰る通り全く至らず、心苦しい限りです。

    キャンセル

回答 1

checkベストアンサー

+1

// public static function pagination( $pages, $paged, $range = 2, $show_only = false ) {
// ↓
   function pagination( $pages, $paged, $range = 2, $show_only = false ) {

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/30 18:40

    ご回答ありがとうございます。

    そちらの部分は削除致しました。

    どうやら$pagesが代入されないようで、
    <div class="pagination"><span class="page_num">Page 1 of 0</span></div>
    がechoされたものの、ifの中の「前へ」などがechoされませんでした。

    そこで重ねて質問させて頂きたいのですが、$pagesへの代入は、$posts_array->max_num_pagesではいけないのでしょうか?

    キャンセル

  • 2018/11/30 18:44

    $posts_array = get_posts( $args );
    としているので$posts_array は配列です。
    $posts_array->max_num_pagesとして取得できるのは $posts_arrayに new WP_Query で作ったオブジェクトが入っているときです。

    キャンセル

  • 2018/11/30 19:04

    こんばんは。お世話になっております。ご返信ありがとうございます。

    それでは
    ➀$posts_array->max_num_pagesではない方法で取得する。
    ➁「/* 履歴の出力 */」の部分を書き直す。
    というわけですね。

    試しに➁の場合ですと、質問のように修正したコードに間違いはどこにありますでしょうか?

    キャンセル

  • 2018/11/30 19:18

    「うまくできない」とは「何をしたときに」「どうなると思って」「どうなったのか」を、出ているエラーなどと併せて、具体的に記述されたほうが回答を得られやすいと思います。

    また、WordPressのデフォルト動作と違うURLでのページングを設置することは関係する設定が多いため、お勧めしません。別の方法を模索されることをお勧めします。

    キャンセル

  • 2018/11/30 19:31 編集

    重ね重ね大変失礼致しました。

    どうやらトップページでのみ動作しないようでしたので、その点に絞って改めて質問を投稿するように致します。

    今回の件は「2018/11/30 18:44」のご返信でもって解決致しました。どうもありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • PHP

    24449questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • HTML

    11803questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • WordPress

    9098questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • HTML5

    5247questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。