サポート » マルチサイト » 親サイトにページャをつける

  • マルチサイトで構築したサイトがあります。
    親サイトに店舗一覧ページを作成したのですが、ページャーが動きません。
    ページャーをつける方法はありますでしょうか?

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • https://ja.wordpress.org/support/topic/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E5%AD%90%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E4%B8%80%E8%A6%A7%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%9F%E3%81%84/

    こちらの一覧表示という記事が一覧の作成について解決を促されるのではないでしょうか。

    大変失礼ですが私の認識としてはページャというのはページングをする機能のことでページングとは複数ある内容について
    1回の表示単位を区切ることで

    1.100項目あるものを、5項目1ページ単位で切り分けることを「ページング」 1~100項目→1ページ(1~5)、2ページ(6~10)
    2.5項目の参照位置を移動したりさせたりすることを「ページ送り」 1ページから2ページに移動することの機能(1項目の次は6項目)
    3.「ページ送り」をさせるものを「ページャ」 現在1ページを表示しているので2ページへのリンクを表示させるもの

    このページャを作成するにあたって、ページングする元データをどこから持ってくるかによってかわると思うのですが
    表示個数が表示対象分母より小さくかつ同一画面で表示をすることについてのご質問だったでしょうか。

    上記にて紹介いたしましたリンク先はただ一覧を取得するに至るまでかと思いますのでページングが必要であれば
    表示可能と判断した時点で変数に1ずつ追加して、規定値まで到達すると終了、$page 変数の受け取りなどで開始点と開始点+表示数の
    ループを組む、などになるかと思いますが分母の取得方法によってページング方法の選択肢にご参考になればと思います。

    トピック投稿者 inoue0213

    (@inoue0213)

    ご質問の情報不足ですみません。
    親サイトの方には子サイトで作成したページの情報を取得し、一覧ページの作成をする事まではできております。
    そこで一覧ページ(約50店舗分)に約12件の表示でページングをつけたいのですが、どのようにループを組めば良いのかがわかりません。一般的なループ処理にて$page変数でやったのですが、ページングの表示がされないので、困っています。

    CG

    (@du-bist-der-lenz)

    現状、その50件全てが一覧されているのですか、12件表示はできているのですか。

    トピック投稿者 inoue0213

    (@inoue0213)

    はい。現状は12件表示はできています。
    そこから、表示されていない店舗の分をページングをつけて表示させたいと思っております。

    まさにページャー単体が必要だったのですね。
    当方物分かりが悪く受け答えの順序が逆になってしまい申し訳ございません。

    抽出件数の整形がWordpress既成のものであればwp_link_pagesにてページャーが出るかと思うのですが
    独自にループを組まれているのであれば、50件の形がどうなのかわかりませんが以下が参考になりませんでしょうか。

    
    //$page;
    //$店舗50件 = 50件分;
    //仮に50店舗を配列にしてそれを配列にいれていたら
    //$店舗50件
    //├店舗1array("店舗名","URL");
    //├店舗2array("店舗名","URL");
    //├店舗3array("店舗名","URL");
    //└店舗4array("店舗名","URL");
    //$iは0から50未満(49まで)を++(1ずつ加算)
    for($i=0;$i<count($店舗50件);$i++){
    //全件列挙
    	表示 $店舗50件[$i]["店舗名"].$店舗50件[$i]["URL"];
    }
    
    //12毎ページング
    //$page = 1; //1ページ目 ページ指定がない場合も1ページ目なので注意
    //if($page==0){ $page = 1; }
    //ページ送り個数
    $pageNationCount = 12;
    //ページスタート位置作成
    $StartPageID = ($pageNationCount*($page-1));//1ページ目 0x12=0 2ページ目 1x12=12 ページ数-1なので
    $End__PageID = ($pageNationCount*($page));//1ページ目 1x12=12 2ページ目 2x12=24
    //1ページ目 0~11(12件) 2ページ目 12~23(12件)(数値は配列番号)
    //終端数”未満”なので0起算~終端-1
    for($i=$StartPageID;$i<$End__PageID;$i++){
    //ページに相当する内容を表示
    	表示 $店舗50件[$i]["店舗名"].$店舗50件[$i]["URL"];
    }
    

    またwp_queryの記述ですとoffset(開始点)を上記開始位置に合わせて12件取得するとページングになるのではないでしょうか。

    トピック投稿者 inoue0213

    (@inoue0213)

    迅速なご回答感謝いたします。
    一度頂いたものにて実装させて頂きます。
    またご不明点等ありましたら、こちらにて連絡をいれさせて頂きます。
    ありがとうございます!

    トピック投稿者 inoue0213

    (@inoue0213)

    申し訳ございません。
    下記の様なコードでループ処理を行っています。

    <?php
    $sql = '';
    $blog_id_arr = array(2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48);//取得するブログIDの配列
    $tmp = $blog_id_arr;
    foreach($blog_id_arr as $b_id){
     next($tmp);
     switch_to_blog($b_id);
     $sql .= <<<HERE
    (SELECT *, $b_id as blog_id
    FROM $wpdb->posts
    WHERE post_type = 'page'
    AND post_status = 'publish')
    HERE;
      
     if(current($tmp) !== false){
     $sql .= "UNION\n";
     }
     restore_current_blog();
    }
    $sql .= <<<HERE
    ORDER BY post_date DESC
    LIMIT 50
    HERE;
    $posts = $wpdb->get_results($sql);
    ?>
      
    <?php
    foreach ($posts as $post):
     switch_to_blog($post->blog_id);
     setup_postdata($post);
    ?>
              <li>
                <a href="<?php the_permalink() ?>">
                  <?  
    //画像(返り値は「画像ID」)
    $img = get_field('shop_images');
    $imgurl = wp_get_attachment_image_src($img, 'full'); //サイズは自由に変更してね
    if($imgurl){ ?><img src="<? echo $imgurl[0]; ?>" alt="">
    <? } ?>
                  <p class="list_name"><?php echo mb_substr($post->post_title, 0, 25).''; ?></p>
                  <p class="list_version"><?php 
            $text = mb_substr(get_field('shop_description'),0,30,'utf-8'); 
            echo $text.'...';
    ?></p>
                  <p class="store_link"><?php the_field('shop_tag'); ?></p>
                </a>
              </li>
    <?php endforeach;?>
    <?php wp_reset_postdata();?>
    <?php restore_current_blog();?>
            </ul>

    この様な形でページングはつけれますでしょうか?

    拝見しましてSQLが大変なことになっているとおもうのですがこれは重くないですか?
    本題はそこではないとおもうのでそれはお任せして、ページング対象要素は最終のforeach循環部ですよね。
    posts の個数内で、開始点と終了点をpage変数から取得、設定してfor 文でまわすとページになりませんか?

    ページャを忘れていました。
    $page x12 が最大値より小さいときはparmalinkにpost+1をリファレンシャルして、ページ送り次へのリンクを作成して、postが2以上の場合はpost-1のリンクで前に送るがつくれるのではないでしょうか。

    • この返信は7年、 1ヶ月前にmsioが編集しました。理由: 肝心のページャ機能部分を記載していませんでした。

    SQLを少なくしても大丈夫だと思うので子サイトの取得方法は変更されてはどうでしょうか。
    SQLをご利用になられるのであれば私には変更の案があります。

    <?php
    $SQL_text = "";//文字形式が入る用途をしめした変数初期化
    //抽出対象ID群作成
    //2~48まで抜けなく順どおりなのでループで作成
    for($i=2;$i<=48;$i++){
    	$blog_id_arr[] = $i;
    }
    //次の値があるかどうか確認用だと思いますが
    //次があるかどうかはforでカウント=現在位置
    //リミットを配列数にすると固定値保持の必要がないので不要
    //$tmp = $blog_id_arr;
    
    //作成した抽出対象配列の個数分循環
    //未満として一つ減らすのは0起算で「個数分=50、0起算で50カウント=末尾49」のため
    for($i=0;$i<count($blog_id_arr);$i++){
    //作成した配列の循環番号のブログを取得する
    switch_to_blog($blog_id_arr[$i]);
    //SQL構文
    //全フィールド+ブログIDの番号を実数化した値を改名したフィールドに加え抽出
    //全フィールド出力は必要でしょうか。あとブログIDを追加する必要もありますでしょうか
    //構文は1行ずつにすると分岐などつけやすいと思います
    $SQL_text .= "(SELECT *, $blog_id_arr[$i] as blog_id ";
    //スイッチしたブログの投稿を代入してます?
    $SQL_text .= "FROM $wpdb->posts ";
    $SQL_text .= "WHERE post_type = 'page' ";
    $SQL_text .= "AND post_status = 'publish');
    //現在位置+1が準備した配列の個数よりも小さければ
    if(count($blog_id_arr)>($i+1)){
    //SQL抽出要件を連結する
    $SQL_text .= "UNION\n";
    } //循環おわり
    //ブログを戻す
    restore_current_blog();
    }
    $SQL_text .= "ORDER BY post_date DESC ";
    $SQL_text .= "LIMIT 50 ";
    //50連結したメタ投稿データクエリのようなものを実行しようとしていますが
    //それだけの質量を並列で作業する必要がここにあるのか判断できません
    $posts = $wpdb->get_results($SQL_text);
    //あとこのクエリデータの結果から得られるID すなわち最初に作成した変数と同じもので
    //リスト作成循環を行い各子ブログを読み出しているように見えます。
    //結果としてこの全行程=各ブログIDの配列変数($blog_id_arr)の作成と同義ではないでしょうか
    ?>
    

    上記のSQLによる抽出がなくても以下だけで機能するかと思うのですが
    当方マルチサイトを扱っていなくまたACFプラグインも使用しておりません。
    大変申し訳ございませんがこちらでテストができていないので、文法的におかしなところがあるかもしれません。

    
    //子サイト情報取得 これをそのまま循環して blog_id フィールドを取得しても大丈夫
    $sub_sites = wp_get_sites(); 
    foreach($sub_sites as $value_sub_sites){
    	//各子ブログのIDを取得
    	$blog_id_arr[] = $value_sub_sites["blog_id"];
    }
    //もしくは最上部と同じく手動で作成
    //2~48まで抜けなく順どおりなのでループで作成
    //手動で作成するとブログの増減に応じて手動で変更の要があるとおもいます
    for($i=2;$i<=48;$i++){
    	$blog_id_arr[] = $i;
    }
    
    //12毎ページング
    //ページ指定がない場合も1ページ目なので代入
    //if($page==0){ $page = 1; }
    //ページ送り個数
    $pageNationCount = 12;
    //ページスタート位置作成
    $StartPageID = ($pageNationCount*($page-1));//1ページ目 0x12=0 2ページ目 1x12=12 ページ数-1なので
    //総ページカウントが指定ページ数のページング個数倍より大きい場合は
    if(count($blog_id_arr)>($pageNationCount*$page)){
    //ページ最後は指定個数
    $End__PageID = ($pageNationCount*$page);//1ページ目 1x12=12 2ページ目 2x12=24
    }else{
    //ページングした末尾数値より準備変数量が少ない場合は代入
    $End__PageID = count($blog_id_arr);
    }
    //このForがページング
    for($i=$StartPageID;$i<$End__PageID;$i++){
    	//各IDでブログ切り替え
        switch_to_blog($blog_id_arr[$i]);
    ?>
              <li>
              	<!-- IDでシフトした現在地サイトのリンク -->
                <a href="<?php the_permalink(); ?>">
    <?php
    //以下、現在地のサイト(子サイト情報)取得
    //画像(返り値は「画像ID」)
    $img = get_field('shop_images');
    $imgurl = wp_get_attachment_image_src($img, 'full'); //サイズは自由に変更してね
    if($imgurl){ ?>
    <img src="<? echo $imgurl[0]; ?>" alt="">
    <?php } ?>
    				<!-- ふつうに現在地のブログタイトルを取得 -->
                  <p class="list_name"><?php echo mb_substr(bloginfo(name), 0, 25); ?></p>
                  <p class="list_version"><?php
    $descripstion_text = mb_substr(get_field('shop_description'),0,30,'utf-8');
    echo $descripstion_text.'...';
    ?></p>
                  <p class="store_link"><?php the_field('shop_tag'); ?></p>
                </a>
              </li>
    <?php restore_current_blog(); } ?>
    
    <?php
    //そしてページャ
    //$page の値とページングカウントの総数で有無を確認して出力
    //ページはURLの末尾に数字が入っているとワードプレスが取得して
    //グローバルスコープで扱えます
    $Paging_UP = "";
    $Paging_DOWN = "";
    if($page){ if(is_numeric($page)){ if($page>1){ $StargPosition = (($page-1)*$pageNationCount); }}else{ $StargPosition = 0; }}
    if($page>1){ $nextPageNum = ($page+1); }else{ $nextPageNum = 2; }
    if($EndPosition>(count($blog_id_arr)+$pageNationCount)){ $Paging_UP = "<a href=\"".get_the_permalink().$nextPageNum."/\">NEXT>></a>"; }
    //1ページ目がパラメータ有無どちらでも稼働するので、1になるときのプレビアスは別に整形
    if($page>2){ $Paging_DOWN = "<a href=\"".get_the_permalink().($page-1)."/\"><<PREV</a>"; }else
    if($page>1){ $Paging_DOWN = "<a href=\"".get_the_permalink()."\"><<PREV</a>"; }
    
    //ページャ描画
    //戻るがあれば戻る表示
    echo $Paging_DOWN = "";
    //次があれば次表示
    echo $Paging_UP;
    ?>

    2回ほど修正した記事を投稿したのですがあまり繰り返すと消えてしまうのでもうこのままでおきます。
    不良個所ございますかと思いますが参考程度にいただけると幸いです。

    トピック投稿者 inoue0213

    (@inoue0213)

    ありがとうございます。
    特にSQLにこだわる必要はないですが、調べた結果がSQL文だったのでとりあえずいれただけです。
    何度も何度もご提案下さり大変たすかります。
    一度こちらの環境で出来るか試してみたいと思います。

    • この返信は7年、 1ヶ月前にinoue0213が編集しました。
    トピック投稿者 inoue0213

    (@inoue0213)

    すみません。
    ご提案下さったコードで実装を試したのですが、子サイトの記事が抽出されます。
    当方最初の質問にてお伝えしていなく申し訳ございません。
    構築的には
    子サイト=店舗ページ(固定ページでカスタムフィールドを使用し、フロントページとして使用)
    親サイト=子サイトの店舗ページや各店舗のお知らせ情報を表示させる
    この様な用途、後の運用も考えマルチサイト化にしております。
    そこで親サイトに店舗ページの情報を取得し表示件数オーバーしたのはページャーをつけて
    表示させたいというところではまっていました…
    なにかよいアドバイスがありましたら助かります。

    msio

    (@msio)

    要件としては以下のものでよいでしょうか。

    ・子サイトにはそれぞれ固定のページやお知らせ投稿記事がある
    ・親サイトは各子サイトのそれらを回収して表示させる
    ・★各子サイトの取り出したい情報の抽出法は同じ
      switch_to_blog から restore_current_blog までの間は子サイト領域なので
     その範囲内で get_pages で固定ページ情報を取り出し ★この抽出時条件が同じでいけるか
     wp_query でお知らせ投稿を抽出して変数に代入するまたは表示する。

    スイッチしたあととくになにも指定せず子サイト情報を掲載しているので
    それを整形する形ではどうでしょうか。

    これはページングの問題だと思いますので、ページャは機能しているでしょうか。
    ページャの問題が解決してから次に進んではいかがでしょうか。

    確認行程は以下をお勧めしたいのですがいかがでしょうか。
    ①抽出したい子サイトの数は予定数である ページング要項確認
    $sub_sites = wp_get_sites();
    echo count($sub_sites); で表示される個数は子サイトの数と同じ
    var_dump($sub_sites); 列挙される変数の blog_id フィールドの値は対象の子サイトのIDである

    上記2項目に○がついたら

    ②対象の子サイトにスイッチできているか確認する
    switch_to_blog($blog_id_arr[$i]);
    echo mb_substr(bloginfo(name);この表示は子サイトのサイトタイトルになっているかどうか
    $pages = get_pages( $param ); その範囲内で固定ページを抽出できるかどうか

    ③ページングは可能かどうか ページング稼働確認
    対象のURLの末尾を数字にすると $page 変数にそれと同じ数値がはいっていることが確認できるか
    echo $page;

    一つずつクリアできて、③が完了すれば②の段階に「お知らせ記事」抽出クエリを挟んで取得しませんか?
    ②は連結問題ですが結果的には整形にあたる別問題になればよいと考えているのですがいかがでしょうか。

    トピック投稿者 inoue0213

    (@inoue0213)

    毎回毎回ご対応の程ありがとうございます。
    順を追って頂いたアドバイス通りに確認をしてみます。
    ご不明点等また質問するかもしれませんが、ご対応いただければ幸いです。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • トピック「親サイトにページャをつける」には新たに返信することはできません。