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

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

ただいまの
回答率

89.98%

search.phpを使わない検索ページで、はじめから投稿を全件表示したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,237

st20

score 5

5年以上前に作られた、Wordpressサイトの改装を任されています。(前制作者とは面識なし)

前提・実現したいこと

このページは、投稿を検索するページですが
search.php等が使われておらず、独自にプログラミングされているようです。

現状「検索」ボタンを押さないと投稿が表示されませんが、
「はじめから全投稿が表示されている」
かつ「検索ボタンを押すと絞り込まれる」
ようにしたいです。

色々やってみたのですがうまくいかず、
そもそも考え方が間違っている気がして質問させていただいております。。

該当のソースコード

全体的に無駄が多くて見づらいかと存じますが何卒ご容赦ください。

    <form method="get" action="<?php echo the_permalink();?>">
    <table>
        <tr>
            <td>カテゴリ</td>
            <td><?php 
            //投稿のカテゴリーをドロップメニューとして表示
            wp_dropdown_categories("depth=0&orderby=id&hide_empty=1&show_option_all=すべて&selected=". $_GET['cat']); ?></td>
            <td rowspan="2" style="padding-left:20px;padding-bottom:15px;">
            <input type="submit" name="btn_submit" value="検索" style="cursor:pointer;" /></td>
        </tr>
        <tr>
            <td></td>
            <td><select name="y">
                <option value="">すべて</option>
                <?php 
                //投稿年数をドロップメニューとして表示
                    query_posts('posts_per_page=-1');
                    $year=0;
                    while (have_posts()) : the_post();
                    if ($year!=get_the_date('Y')) { $year=get_the_date('Y');
                ?>
                <option value = <?php echo $year; ?><?php if ($year == $_GET['y']) echo ' selected'?>><?php echo $year; ?></option>
                <?php }
                    endwhile;
                    wp_reset_query();
                ?>
                </select></td>
        </tr>
    </table>
    </form>
</div><!--search-->

<div class="wrap cf">
<?php 
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
if (get_query_var('cat') <> "" || get_query_var('y') <> "") { //もしカテゴリーまたは施工年に値があれば(検索ボタンが押されたら?)
    query_posts($query_string .'&posts_per_page=12&cat='. $_GET['cat'].'&year='. $_GET['y'].'&paged='.$paged);//検索結果を出力
?>

    <p class="search">検索結果&ensp;:&ensp;<?php echo $wp_query->found_posts; ?></p>

    <?php //ページナビ
        if(function_exists('wp_pagenavi')) { wp_pagenavi(); }
        $i = 0;
    ?>
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
        <?php if (($i <> 0) && ($i % 4 == 0)) { ?>
        <?php } ?>

        <div id="post-<?php the_ID(); ?>" class="post img-left clearfix">
            <h3 class="title"><a href="<?php the_permalink() ?>" class="fancybox">
            <?php //20文字以上のタイトル省略
                if(mb_strlen($post->post_title, 'UTF-8')>20){
                    $title= mb_substr($post->post_title, 0, 20, 'UTF-8');
                    echo $title.'…';
                }else{
                    echo $post->post_title;
                }
            ?>
            </a></h3>
            <p class="time"><?php the_time("Y年m月") ?></p>
            <?php if (has_post_thumbnail()) : ?>
                <p class="thumb"><a href="<?php the_permalink(); ?>" class="fancybox"><?php the_post_thumbnail('thumbnail'); ?></a></p>
            <?php else : ?>
                <p class="thumb"><a href="<?php the_permalink(); ?>" class="fancybox post_noimage">no image</a></p>
            <?php endif ; ?>
        </div>

    <?php $i++;
        endwhile; else: ?>
        <div class="post">
            <p>該当する記事がありません</p>
        </div>
    <?php endif; ?>
    <?php wp_reset_query(); ?>
    <?php } ?>

</div><!--wrap-->

試したこと

if (get_query_var('cat') <> "" || get_query_var('y') <> "") {
ー中略ー
 <?php endif; ?>

上記部分をさらにループに入れ込んで、
検索ボタンを押す前と押した後で表示分けすればよいかと考え、
前段階としてループの外(</div><!--search-->の直下)に全記事を読み込むコードを書いたのですが(内容は上記のhave_posts()のループと全く同じにしました)
そもそも投稿を読み込んでくれず、なぜか固定ページの「実績検索」(本ページ)が1件だけ表示されるだけでした。

どのように書けばいいのか、そもそも実現できるのか、自分では手詰まりになってしまったため、何か手がかりでもよいので助言いただけませんでしょうか。

(ちなみに、投稿一覧を新たに作り、search.phpを使って普通に絞り込み検索をする方法もためしてみたのですが、年別検索のコードがどうしてもうまく書けず、挫折しました。こちらの方が簡単でしょうか…)

補足情報(言語/FW/ツール等のバージョンなど)

wordpress4.8.2
※古いコードのため、非推奨の「query_posts」を使っていたりしますが、そのあたりは全件表示が解決できてから少しずつ直そうと考えています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

URLを管理画面からパラメータを含めたものに変更は出来ないと思います。

多分、こんな感じにしておけば良いと思いますが。

<?php } ?>

</div><!--/jisseki_wrap-->

<?php }else{ ?>
    <?php //ページナビ
        if(function_exists('wp_pagenavi')) { wp_pagenavi(); }
        $i = 0;
    ?>
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
        <?php if (($i <> 0) && ($i % 4 == 0)) { ?>
        <?php } ?>

        <div id="post-<?php the_ID(); ?>" class="post img-left clearfix">
            <h3 class="title"><a href="<?php the_permalink() ?>" class="fancybox">
            <?php //20文字以上のタイトル省略
                if(mb_strlen($post->post_title, 'UTF-8')>20){
                    $title= mb_substr($post->post_title, 0, 20, 'UTF-8');
                    echo $title.'…';
                }else{
                    echo $post->post_title;
                }
            ?>
            </a></h3>
            <p class="time"><?php the_time("Y年m月") ?></p>
            <?php if (has_post_thumbnail()) : ?>
                <p class="thumb"><a href="<?php the_permalink(); ?>" class="fancybox"><?php the_post_thumbnail('thumbnail'); ?></a></p>
            <?php else : ?>
                <p class="thumb"><a href="<?php the_permalink(); ?>" class="fancybox post_noimage">no image</a></p>
            <?php endif ; ?>
        </div>

    <?php $i++;
        endwhile; endif; ?>
<?php } ?>

</div><!--/jisseki_wrap-->

追記

追加したhave_postsにそれらの投稿を全部抜き出す条件を指定してやったらどうでしょう?

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>


<?php
$args = array(
    'post_type' => 'post',
    'posts_per_page' => -1,
    'post_status' => 'publish',

);
$query = new WP_Query( $args );

if ( $query->have_posts() ) : while ( $query->have_posts() ): $query->the_post(); ?>

カテゴリーや投稿タイプ等の必要な情報を当て込んでください。

関数リファレンス/WP Query
https://wpdocs.osdn.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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/13 23:21 編集

    ありがとうございます!
    試してみたところ、うまくいきそうではあるのですが、やはり自分で試行錯誤していた時と同じく、なぜか固定ページの「実績検索」(このページ自身)が1件だけ表示されてしまいます。

    検索結果から固定ページを除いて、投稿 'post' のみに限定する方法が、search.phpを使っているものであれば検索で見つかるのですが、いまの条件ですとどうすればよいのかわからず…

    私の方でも今一度調べてみたいと思いますが
    もし解決策がおわかりでしたら、ご教示いただけますとありがたいです…!

    キャンセル

  • 2017/10/15 02:16

    追記ありがとうございます。ページ送りを使うために下記のように改変しましたが、ほぼそのままで使わせていただきました。
    非常に助かりました!これからじっくりコードを見て、なぜ自分で実現できなかったか考えてみようと思います。本当にありがとうございました!

    ``` <?php
    $args = array(
    'post_type' => 'post',
    'posts_per_page' => 12,
    'post_status' => 'publish',
    );
    $my_query = new WP_Query( $args );


    //ページナビ
    $my_query = new WP_Query( array(
    'paged' => $paged ,
    'posts_per_page' => 12
    ));
    if(function_exists('wp_pagenavi')) { wp_pagenavi(array('query' => $my_query)); }
    $i = 0;

    if ( $my_query->have_posts() ) : while ( $my_query->have_posts() ): $my_query->the_post(); ?>
    ```

    キャンセル

0

的はずれな回答でしたらすみません。
メニューから実績検索へのリンクを
http://www.kawasaki-sekkei.com/jisseki/?cat=0&btn_submit=%E6%A4%9C%E7%B4%A2&y=
にしちゃうとかはやはりダメなのでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/13 20:34

    なるほど…!盲点でした。
    他に手がないようなら、そうしてみようと思います。

    しかしながら、グローバルメニューからのリンクなのでURLは綺麗な方が、より理想には近いです。
    できれば、やはりプログラムでなんとか一覧を出したいのですが、難しいでしょうか。。

    キャンセル

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

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