サポート » マルチサイト » マルチサイト全体を検索対象としたときページ送りがうまくいかない

  • お世話になります。
    親サイト、子サイトのすべてを検索対象にする作業をしています。

    【WordPressのマルチサイト全体で検索できるようにする】
    http://kazu69.net/blog/memo/1749

    上のサイトを参考に、全体を検索できるようになりました。

    ただ、検索結果が「1ページに表示する最大投稿数」を超えた場合に正しい件数が表示できなかったので、以下のコードをsearch.phpに追加し、すべての検索結果を表示できるようになりました。

    function search_multisite($query_string) {
    add_action( ‘pre_get_posts’, ‘my_pre_get_posts’ );
    function my_pre_get_posts( $query ) {
    $query->set( ‘posts_per_page’, -1 );
    }

    しかし、たとえば22件の検索結果があったとき、1ページにすべての検索結果が表示されてしまいます。

    1ページの表示数は10件にして、ページ送りで次のページを表示させたいのですが、うまくいきません。

    うまくページ送りができる方法はありますでしょうか。現在のsearch.phpのコードは以下のようなものになります。よろしくお願いいたします。

    <?php
    // 検索クエリを取得
    $search_result = get_search_query();
    // マルチサイト内を検索
    $search_results = search_multisite($search_result);
    
    function search_multisite($query_string) {
    add_action( 'pre_get_posts', 'my_pre_get_posts' );
    function my_pre_get_posts( $query ) {
    $query->set( 'posts_per_page', -1 );
    }
    
       // 文字列エンコード
       $query_string = esc_attr($query_string);
       $search_result = array();
    
       // ネットワーク上のブログを取得
       $blogs = get_blogs_of_user( 1, true);
       foreach ( $blogs as $blog ):
         // ブログを切り替える
         switch_to_blog($blog->userblog_id);
         // 切り替えたブログでqueryを実行
         $search = new WP_Query( array( 's' => $query_string ) );
    
         if ($search->found_posts > 0):
           foreach ( $search->posts as $post ):
             // 投稿記事に関連するグローバル変数を設定する
             setup_postdata($post);
             array_push($search_result, $post);
    
           endforeach;
         endif; 
    
       endforeach;
    
       return $search_result;
       restore_current_blog();
    
     }
    
    ?>      
    
    <h2>検索結果</h2>
    <p>“<?php the_search_query(); ?>”に関連する検索の結果 (<?php echo count($search_results); ?> 件)</p>
    
    <?php
    foreach ( $search_results as $post ) :
    ?>
    <!--検索結果のループ-->
    <div class="searchList">
      <div class="article">
        <h3><a href="<?php echo $post->guid; ?>"><?php the_title(); ?></a></h3>
        <p><?php
        global $post;
        $con = strip_tags( $post->post_content );
        $con = mb_substr( $con, 0, 100 );
        echo $con . '...';?></p>
        <p class="detail"><a href="<?php echo $post->guid; ?>">詳細はこちら</a></p>
      </div>
    </div>
    <!--/検索結果のループ-->
    <?php endforeach;wp_reset_query();?>

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • モデレーター gatespace

    (@gatespace)

    $query->set( 'posts_per_page', -1 );
    だと全件表示です。
    10件でページ送りなら
    $query->set( 'posts_per_page', 10 );

    パラメータの意味はCodexをご参照ください。
    http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query

    ではない?

    トピック投稿者 rriinnddoouu

    (@rriinnddoouu)

    お世話になります。

    $query->set( ‘posts_per_page’, -1 );
    にしたのは、全件表示にしたかったからです。

    なぜここに全件表示が必要だったかというと、こうしないと、管理画面の表示設定の「1ページに表示する最大投稿数」に検索結果が影響されてしまったからです。

    試しに、「1ページに表示する最大投稿数」を1000件にして、search.phpで10件でページ送りと書いても、25件の結果がある場合は、25件が1ページに表示されてしまい、10件表示にはできず、ページ送りも表示されません。

    あと最初の質問では、表示件数の設定の関数を、function search_multisite($query_string) の関数の中に書いていたのですが、これだと検索結果に関係ないものが出ていたので、関数を外に移動しました。

    いずれにしても、「1ページに表示する最大投稿数」に検索結果が影響されることと、ページ送りが出来ないという状況です。

    <?php
    
    add_action( 'pre_get_posts', 'my_pre_get_posts' );
    function my_pre_get_posts( $query ) {
    $query->set( 'posts_per_page', -1 );
    }
    
    // 検索クエリを取得
    $search_result = get_search_query();
    // マルチサイト内を検索
    $search_results = search_multisite($search_result);
    
    function search_multisite($query_string) {
    
       // 文字列エンコード
       $query_string = esc_attr($query_string);
       $search_result = array();
    
       // ネットワーク上のブログを取得
       $blogs = get_blogs_of_user( 1, true);
       foreach ( $blogs as $blog ):
         // ブログを切り替える
         switch_to_blog($blog->userblog_id);
         // 切り替えたブログでqueryを実行
         $search = new WP_Query( array( 's' => $query_string ) );
    
         if ($search->found_posts > 0):
           foreach ( $search->posts as $post ):
             // 投稿記事に関連するグローバル変数を設定する
             setup_postdata($post);
             array_push($search_result, $post);
    
           endforeach;
         endif; 
    
       endforeach;
    
       return $search_result;
       restore_current_blog();
    
     }
    
    ?>      
    
          <h2>検索結果</h2>
          <p id="searchResult">“<?php the_search_query(); ?>”に関連する店舗検索の結果 (<?php echo count($search_results); ?> 件)</p>
    
    <?php
    foreach ( $search_results as $post ) :
    ?>
    <!--検索結果のループ-->
    <div class="searchList">
      <div class="article">
        <h3><a href="<?php echo $post->guid; ?>"><?php the_title(); ?></a></h3>
        <p><?php
        global $post;
        $con = strip_tags( $post->post_content );
        $con = mb_substr( $con, 0, 100 );
        echo $con . '...';?></p>
        <p class="detail"><a href="<?php echo $post->guid; ?>">詳細はこちら</a></p>
      </div>
    </div>
    <!--/検索結果のループ-->
    <?php endforeach;wp_reset_query();?>
    モデレーター jim912

    (@jim912)

    できないことはないですが、いろいろと面倒です。

    まず、通常の search.php で実装を進めておられますが、これだと、マルチサイトの検索は、必ず単一サイトの検索よりヒット数が多くなるため、表示数をどのように設定してもページ送りができなくなる可能性があります。

    これを回避するには、特定の固定ページを検索結果の表示ページとするしかありません。
    ただし、そのままだと、固定ページのクエリーが含まれてしまうため、検索結果が正しくなりません。これについては、pre_get_posts において、pagename パラメーターを空にしておく必要があります。

    ページ送りについては、 $search_results に全ての検索結果が入るようになるため、ページ数に応じて、この配列から表示するものを抜き出す処理が必要です。

    ページ送りのナビゲーションの表示も、標準のものとは異なる処理となってしまっているため、通常参照する $wp_query を $search_results の内容に合わせて書き換えるか、$search_results から独自に作り出す必要があります。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「マルチサイト全体を検索対象としたときページ送りがうまくいかない」には新たに返信することはできません。