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

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

ただいまの
回答率

90.76%

  • PHP

    19200questions

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

  • WordPress

    6664questions

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

カテゴリー、タクソノミーでの絞り込み検索結果一覧のページ送りを指定表示件数以下の時非表示にしたい

受付中

回答 1

投稿

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

bobodog

score 2

 カテゴリー、タクソノミーでの絞り込み検索結果一覧のページ送りを指定表示件数以下の時非表示にしたい

WordPressで自作テーマを作成しています。
Custom Post Type UI で作成した「college」というカスタム投稿の内容を、カテゴリーで検索、タクソノミーで検索、キーワードで検索と三つの方法で検索できるよう作業を進めています。
検索結果は表示できるようになったのですが、検索結果に該当する投稿が指定している件数以下の時もページ送りがずっと表示されている状態で困っています。
タクソノミーとカテゴリーで絞込み検索をした時に常時表示され、キーワード検索をした時は該当する記事が指定している件数以下の時消えます。キーワード検索をした時のように指定件数以下の時には表示されないようにしたいです。
関係していそうな箇所のphpソースを記載いたします。

 functions.php

/* 検索結果ページにページネーション追加 */

function page_navi() {
  global $wp_query;
  $bignum = 999999999;
  if ( $wp_query->max_num_pages <= 1 )
    return;
  echo '<div class="pagenation">';
  echo paginate_links( array(
    'base'         => str_replace( $bignum, '%#%', esc_url( get_pagenum_link($bignum) ) ),
    'format'       => '?paged=%#%',
    'current'      => max( 1, get_query_var('paged') ),
    'total'        => $wp_query->max_num_pages,
    'prev_text'    => '<i class="fa fa-caret-left"></i>',
    'next_text'    => '<i class="fa fa-caret-right"></i>',
    'type'         => 'list',
    'end_size'     => 3,
    'mid_size'     => 3
  ) );
  echo '</div>';
}

 search.php

<?php
$s = $_GET['s'];
$catnum = "";
$post_tag = "";
if(filter_input(INPUT_GET, 'catnum')) {
    $catnum = $_GET['catnum'];
} 
if(filter_input(INPUT_GET, 'subject')) {
    $post_tag = $_GET['subject'];
}
if($post_tag){
    $taxquerysp[] = array(
            'taxonomy'=>'colleges',
            'terms'=> $post_tag,
            'include_children'=>false,
            'field'=>'slug',
            'operator'=>'AND',
            );
}
if($catnum){
    $taxquerysp[] = array(
            'taxonomy'=>'category',
            'terms'=> $catnum,
            'include_children'=>false,
            'field'=>'term_id',
            'operator'=>'AND',
            );
} else {
     $taxquerysp[] = array(
     'taxonomy'=>'category',
     'terms'=> 'colleges',
     'include_children'=>false,
     'operator'=>'OR',
    );
}
?>
<?php
$args = array(
    'post_type'=>'college',
    'tax_query' => $taxquerysp,
    's' => $s,
    'post_status' => 'publish',
    'order' => 'ASC',
    'orderby' => 'meta_value',
    'meta_key' => 'yomi',
    'paged'=>get_query_var('paged'),
    'posts_per_page' => 5,
);
$q = new WP_Query( $args );
?>
<section class="list">
<h3><?php the_search_query(); ?><?php if($catnum){ ?><?php echo get_cat_name($catnum); } ?><?php if($post_tag){ ?><?php echo get_term_by('slug',$post_tag,"post_tag")->name; } ?>」の検索結果</h3>
<?php if ( $q->have_posts() ) : while ( $q->have_posts() ) : $q->the_post(); ?>
<div class="list__box clearfix">
ループ内容
</div>
<!-- /.list__box -->
<?php endwhile; else : ?>
<p>申し訳ございません。該当する記事がございません。</p>
<?php endif; ?>
</section>

<?php page_navi(); ?>

<?php wp_reset_query(); ?>

 searchform.php

<!-- カテゴリー検索 -->
<form method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>">
    <input type="hidden" name="s" id="s01" />
     <select name="catnum">
        <option value="">選択してください</option>
        <?php
        $categories = get_categories();
        foreach($categories as $category) :
        ?>
            <option value="<?php echo $category->term_id; ?>"><?php echo $category->cat_name; ?></option>
        <?php endforeach; ?>
    </select>
    <input id="submit" type="submit" value="&#xf002;" accesskey="f" />
</form>

<!-- タクソノミー検索 -->
<form role="search" method="get" id="searchform" action="<?php echo home_url( '/' ); ?>">
          <input type="hidden" name="s">
          <input type="hidden" name="post_type" value="college" />
          <select name="subject">
          <option value="">選択してください</option>
    <?php
    $taxonomy_name = 'colleges';
    $taxonomys = get_terms($taxonomy_name);
    if(!is_wp_error($taxonomys) && count($taxonomys)):
        foreach($taxonomys as $taxonomy):
            $tax_posts = get_posts(array('post_type' => get_post_type('college'), 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) );
            if($tax_posts):
    ?>
    <option value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></option>
    <?php
            endif;
        endforeach;
    endif;
    ?>
    </select>

          <input type="submit" id="searchsubmit" value="&#xf002;" />
</form>

<!-- キーワード検索 -->
<form method="get" id="searchform" action="<?php echo home_url('/'); ?>">
  <input type="text" name="s" id="testSearchInput" value="<?php the_search_query(); ?>" placeholder="入力例:保育士" />
  <input type="hidden" name="post_type" value="college">
  <input type="submit" value="&#xf002;" accesskey="f" />
</form>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

+1

page_navi(); に $q を渡して $wp_query の代わりに使うように書き換えてみては。
また、テンプレート上で new WP_Query するより pre_get_posts でクエリ自体を書き換えるほうがナビゲーションの問題が出にくいです。

【pre_get_postsでメインクエリを制御する | Tips Note by TAM】
https://www.tam-tam.co.jp/tipsnote/cms/post9420.html

【【wordpress】pre_get_postsを使ってみませんか? - Qiita】
https://qiita.com/_ruka_/items/e14280d34eddf49efad1

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/29 17:31

    ご連絡遅れてしまい申し訳ございません。ご回答誠にありがとうございます。
    page_navi()に$qを渡して$wp_queryの代わりに使うよう書き換えるというのはfunctions.phpの$wp_queryと書かれている部分を$qに変更すればいいと思い書き換えてみたのですが、どの検索を使用してもページ送りが出てこなくなってしまいました。

    function page_navi() {
    global $q;
    $bignum = 999999999;
    if ( $q->max_num_pages <= 1 )
    return;
    echo '<div class="pagenation">';
    echo paginate_links( array(
    'base' => str_replace( $bignum, '%#%', esc_url( get_pagenum_link($bignum) ) ),
    'format' => '?paged=%#%',
    'current' => max( 1, get_query_var('paged') ),
    'total' => $q->max_num_pages,
    'prev_text' => '<i class="fa fa-caret-left"></i>',
    'next_text' => '<i class="fa fa-caret-right"></i>',
    'type' => 'list',
    'end_size' => 3,
    'mid_size' => 3
    ) );
    echo '</div>';
    }

    またpre_get_postsで表示する方法に変えるものも併せて作成してみたのですが、キーワード検索結果は正常に表示されますが、カスタムフィールドの値での並び替え(五十音順に並び替え)が効かなくなってしまいました。またキーワード検索以外は何を選択しても全件表示されるようになってしまいました。

    function pre_get_posts_custom($query) {
    if( is_admin() || ! $query->is_main_query() ){
    return;
    $s = $_GET['s'];
    $taxquerysp[] = array(
    'taxonomy'=>'category',
    'terms'=> 'colleges',
    'include_children'=>false,
    'operator'=>'AND',
    );
    if(filter_input(INPUT_GET, 'catnum')) {
    $catnum = $_GET['catnum'];
    if($catnum){
    $taxquerysp[] = array(
    'taxonomy'=>'category',
    'terms'=> $catnum,
    'include_children'=>false,
    'field'=>'term_id',
    'operator'=>'AND',
    );
    }
    }
    if(filter_input(INPUT_GET, 'subject')) {
    $post_tag = $_GET['subject'];
    if($post_tag){
    $taxquerysp[] = array(
    'taxonomy'=>'colleges',
    'terms'=> $post_tag,
    'include_children'=>false,
    'field'=>'slug',
    'operator'=>'AND',
    );
    }
    }
    if( $query->is_search() ){
    $query->set( 'post_status','publish' );
    $query->set( 'orderby','meta_value' );
    $query->set( 'meta_key','yomi' );
    $query->set( 'order','ASC' );
    $query->set( 'tax_query',$taxquerysp );
    $query->set( 's',$s );
    $query->set( 'posts_per_page', 2 );
    return;
    }
    }
    }
    add_action( 'pre_get_posts', 'pre_get_posts_custom' );


    お手数をおかけしてしまい申し訳ございませんがおかしい点をご指摘くださると幸いです。

    キャンセル

  • 2018/05/29 17:33

    コメントエリアではマークダウンが使えないため、コードはここではなく質問文に追記してください。(決して元のコードを消さないでください)

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • PHP

    19200questions

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

  • WordPress

    6664questions

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

  • トップ
  • PHPに関する質問
  • カテゴリー、タクソノミーでの絞り込み検索結果一覧のページ送りを指定表示件数以下の時非表示にしたい