サポート » 使い方全般 » posts_per_pageがきかない

  • こんにちは。いつもお世話になっております。
    PHPはまだまだ初心者で行き詰まってしまったので、ご教授をお願いします。

    現在お店の紹介とスタッフの出勤情報をのせています。
    カスタム投稿とカスタムフィールドで作成し各スタッフの情報をひも付けし、独自DBにて出勤情報を取得しております。
    使用しているプラグインはkrc-cast-managerです。

    独自DBにて出勤情報を取得して表示させている部分がposts_per_pageが効かず困っております。ページャー(PageNavi)は表示されています。
    出勤情報は専用の固定ページ(page-attendance.php)を作成し、ショートコードにて表示させています。

    function.php

    //出勤スケジュール
    function outschedule($day) {  //DBから該当の日付のデータを取得
        global $wpdb;
        $table_name = $wpdb->prefix . 'krc_schedules';
        $schedules = $wpdb->get_var(
            $wpdb->prepare("SELECT work FROM $table_name WHERE day = %s AND status = %d", $day, 0)
        );
        $works = unserialize($schedules);
        return  $works;  //配列にして返す
    }
    
    function schedulesHtml() {  //ショートコードの中身
        $day = isset($_GET["works"]) ? $_GET['works'] : date_i18n("Y-m-d");
        $works = outschedule($day);
        $len = 6; //+1
    
        $week = array("日", "月", "火", "水", "木", "金", "土");
        $w = date('w', strtotime($day));
    
        echo '<nav class="attendance-calendar clearfix"><ul>';
        for ($i = 0; $i <= $len; $i++) {
            $y = date('D', strtotime('+'.$i.' day'));
            if ( date_i18n('Y-m-d', strtotime('+'.$i.' day')) == $day ) $y = 'target';
            echo '<li class="' . mb_strtolower($y) . '"><a href="' .  home_url( '/' )  . '/attendance/?works=' . date_i18n('Y-m-d', strtotime('+'.$i.' day')) . '">' . strtoupper(date('n/j(D)', strtotime('+'.$i.' day'))) . '</a></li>';
        }
        echo '</ul></nav>';
    
        if (!$works) {
            //予定がない場合
            echo '<p class="attendance-message">' . date('n/j', strtotime($day));
            echo '(' . $week[$w] . ')';
            echo 'の出勤予定はございません。</p>';
        } else if ( $works !='rest' ) {
            echo '<div class="clearfix">';
            //postid順に配列に入っているのでs_order順にした配列を作る
            $works_array = array();
            foreach($works as $id => $val){
                $works_array[$val["s_order"]] = $id;
            }
            ksort($works_array);
            foreach ($works_array as $rder => $id){
        $paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
                $args=array(
                    'post_type' => 'krc_cast',
                    'post__in' => array($id),
            'posts_per_page' => 3, //取得記事件数
            'paged' => $paged
                );
                $wp_query = new WP_Query($args);
                while (have_posts()): the_post(); $counter++;
                if ($counter <= 1){
                    require("content-cast-first.php");
                }else{
                    require("content-cast.php");
                }endwhile;
                //wp_reset_query();
            }
            echo '</div>';
            echo '<div class="pagination">';
                // ページングを表示
                if (function_exists('wp_pagenavi')) { wp_pagenavi(); }
            // ループ処理のデータをリセット
            wp_reset_query();
            echo '</div>';
        } else {
            //休み
            echo '<p class="attendance-message">申し訳ありません。' . date('n/j', strtotime($day));
            echo '(' . $week[$w] . ')';
            echo 'の出勤予定者はおりません。</P>';
        }
    }
    add_shortcode('scheduleshtml', 'schedulesHtml'); //

    色々試してみたのですが、何が原因でposts_per_pageが効かないのかが分かりません。
    ご教授お願い致します。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • 具体的に「(効かなくて)どうなってますか?」

    いくつかおかしな点があるようです……

    トピック投稿者 natsu85

    (@natsu85)

    Hinaloe様お返事ありがとうございます。

    have_posts(), the_post()を
    $wp_query->have_posts(),$wp_query->the_post()
    に変更し、echoをreturnに変更しました。
    echoを全てreturnに変更した時点でショートコード部分が表示されなくなってしまいました。
    初歩的な質問で申し訳ないのですが、’と”の指定はechoと同じでしょうか??

    echoの時の表示は
    ‘posts_per_page’ => 3
    と指定していてもその日の出勤予定者全てが表示されている状態でした。
    ページャーは表示されていました。

    すべて return にしてしまうと、最初ので処理が終了してしまうので、一旦変数に入れてやるなどする必要があります。
    https://gist.github.com/hinaloe/249e86ff4741434ecc79 (=>Sample1)

    ただ、これだとrequire("content-cast-first.php");の部分が別の場所に出てしまう気がするので、既存のコードは元のまま、ob_startでバッファリングする方が手っ取り早いかもしれません。(同リンクSample2)

    その日の出勤予定者全てが表示されている状態でした。

    foreach ($works_array as $rder => $id)

    で全員に対してそれぞれにクエリかけているのだから当然ではないですか?人数でページングするならforeach辺りのループを制御してやる必要がありますが…

    (ところで表示されていたページャーと言うのは少し用途の異なったものではないですか?想定と。)

    トピック投稿者 natsu85

    (@natsu85)

    Hinaloe様

    お返事ありがとうございます。

    Sample2を試したところ表示することはできました!!

    foreach ($works_array as $rder => $id)
    でその日に登録している人全員に番号振ってその番号順に表示させる
    という認識であってるでしょうか?
    この順番に表示させ、人数でページングさせるにはどのようにすればよいでしょうか??
    何かヒントをお願いできますでしょうか。

    表示されているページャーの用途が異なったものとは、どのようなことでしょうか??
    そもそもの考え方が違うのでしょうか?
    固定ページで表示はさせていますが、ショートコードにて上記を記載しているため、ショートコード内にページャーを設置しないと意味が無いと考えて記載していたのですが…

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「posts_per_pageがきかない」には新たに返信することはできません。