[wp]CPT UIの記事一覧生成メモ

よく使う。

汎用型

FAQの質問一覧とかで使ったりする。

<?php
    $myposts = new WP_Query(array(
        'post_type' => '【カスタム投稿スラッグ名】',
        'taxonomy' => '【タクソノミースラッグ名】',
        'term' => '【ターム名】',
        'posts_per_page'=> -1, //-1だと全部表示
        'order' => 'ASC' //並びの指定(投稿の古い順)
    )); 
?>
<?php if($myposts->have_posts()): ?>
<!-- 投稿があった場合表示 -->
<ul>
    <?php while($myposts->have_posts()): $myposts->the_post(); ?>
    <!-- 投稿ごとの表示 -->
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
</ul>
<?php endif; ?>
<?php wp_reset_query(); ?>

wp上であればどこでも表示できる。

$mypostsのところで抽出ルールを指定する。
不要であれば行ごと削除する。
逆に言えば、特定のタグを付けたものを呼び出したければtaxonomyとtermを記入する。
termは複数指定ができるのでより詳細な抽出が可能。

wp_reset_query();は無条件で書く。
これをやっておかないと、ページ上に複数の一覧を設置したい時にバグる。

抽出の応用

カスタムタクソノミーは1つの投稿に対して複数設置ができる。
商品カテゴリ用と商品ジャンル用とか、そういう感じでタクソノミーを使い分けると抽出の際に便利。

タクソノミーに親子関係を設定して、特定の親を持つやつ、っていう抽出方法もあるけど。
タクソノミー自体分けたほうがスマートというか、混乱しないと思う。

検索結果における抽出の考え方

また商品で例えるけど、WPの検索はカテゴリだったりフリーワードで検索条件を指定できる。
細かく指定して抽出したい場合、カスタムフィールドも抽出対象にしちゃえばいい。

抽出条件をgetに追加しまくって、それを検索結果画面の書き出しルールに組み込んでいく。

こんな感じ。

<form id="form" action="?" method="get">
<input type="hidden" name="s" value="">
<select name="term">
<?php
  $terms = get_terms('【タクソノミースラッグ名】');
  foreach ( $terms as $term ) {
    echo  '<option value="'.esc_html($term->name).'">'.esc_html($term->name).'</option>';
  }
?>
</select>
<select name="customfield">
<option value="">select</option>
<option value="100">100</option>
<option value="1000">1000</option>
<option value="10000">10000</option>
</select>
<button value="submit">Search</button>
</form>

フリーワードは指定しない、特定タクソノミー下のタームと特定カスタムフィールドを抽出する検索フォームがあったとして、

<?php
    $cnt = 0;
    $term = $_GET['term'];
    $customfield = $_GET['customfield'];
    $myposts = new WP_Query(array(
        'post_type' => '【カスタム投稿スラッグ名】',
        'taxonomy' => '【タクソノミースラッグ名】',
        'term' => $term,
        'posts_per_page'=> -1, //-1だと全部表示
    )); 
?>
<?php if($myposts->have_posts()): ?>
<!-- 投稿があった場合表示 -->
<ul>
    <?php while($myposts->have_posts()): $myposts->the_post(); ?>
        <?php if($customfield == null or get_field('customfield') == $customfield): ?>
            <!-- 投稿ごとの表示 -->
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endif; ?>
        <?php if ($myposts->current_post == $myposts->post_count - 1): ?>
            <?php if($cnt == 0): ?>
                <p>なにもないよ</p>
            <?php endif; ?>
        <?php endif; ?>
    <?php endwhile; ?>
</ul>
<?php else: ?>
<p>なにもないよ</p>
<?php endif; ?>
<?php wp_reset_query(); ?>

乱暴だけどこんな感じ。褒められたもんじゃないね。
記事一覧の応用で、書き出し直前のifでカスタムフィールドの内容を判定。

今回はタクソノミーを指定してタームを書き出してるけど、タクソノミーも検索対象に含むことができるからそこはまあ用途に応じて。

この場合の「該当記事なし」はタクソノミーレベルで該当なしの場合と、カスタムフィールドの抽出で該当なしの2パターンがある。

タクソノミーレベルの方はいいとして、カスタムフィールドについては、該当記事があった場合に$cntでカウントするように仕込んでおいて、whileの一番最後の処理のときに$cntが0のままだったら記事なしってことにしてある。

<?php if($customfield == null or get_field('customfield') == $customfield): ?>

ここなんだけど、「指定がない or 指定と合致する場合」っていうやつ。
後者の「==」を「<=」とか「>=」とかそういうのにすると、○円以上・以下みたいな感じで抽出できる。

ほんとこれはブサイクすぎるんで、突貫の場合はいいけどちゃんとするべきときはちゃんとしましょう。この書き方を採用すると複数条件を作るとifをそれだけ足していく作業になる。やりたいこととしては間違ってないんだけど、処理的に間違ってる気がする。

jsでURLパラメータを取得する方法

余談というか、応用の話。

        function getParam(name, url) {
            if (!url) url = window.location.href;
            name = name.replace(/[\[\]]/g, "\\$&");
            var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
            results = regex.exec(url);
            if (!results) return null;
            if (!results[2]) return '';
            return decodeURIComponent(results[2].replace(/\+/g, " "));
        }

これを宣言すると任意のパラメータを取得できるようになる。
例えばこう。

        product_type = getParam('product_type');
        $('input:radio[value='+ product_type +']').prop('checked', true);

「getParam()」で指定したら拾える。パラメータに含まれてたら拾うっていうざっくりした仕組みなので、パラメータのどの位置に書かれていても大丈夫。上でいうと、「?product_type=***」だろうが「&product_type=***」だろうが大丈夫。連想配列みたいなもんですね。

検索結果画面に検索フォームを設置して、フォームに検索条件を反映させたいよって時とかに使える。
まあphpでもできるんだけどね。

記事ページとかで擬似商品ページを作ったとして、疑似購入ボタンを作って各項目にgetで飛ばすとして、飛ばす先が問い合わせフォームで、各項目にgetで飛ばした内容を反映させるときとかにも使える。これはphpとかwpの機能だと難しいからjsの仕事かもね。

コメント

タイトルとURLをコピーしました