アーカイブページ等の記事の並び替え方法

参考 http://ateitexe.com/wordpress-archive-sort-popular/

まずパーマーリンクを
投稿名にしなければならん

ポストタイプアーカイブ
http://www.d-format1.com/car/
のようにケツにスラッシュで終わらなかん


固定ページでは
is_main_くえり がポストタイプを指定できなかったな〜
カスタムポストでなく ポストならできるかも

URLに
?sort=newerのように

?自分できめた文字=自分で決めた文字

というURLをつけるように

ボタンをつくる。

簡単にコードをまとめたやつを書こう

<?php
if ( is_archive() || is_search() ) { //アーカイブか検索ページだったら
    global $wp_query;
    $total_results = $wp_query->found_posts; //件数を取得しておく
	
//※ソールドアウトの設定確認
}
?>
 



   
</div></h2>



<?php //※1 2ページ目以降でボタンを押されても、1ページ目に飛ぶようにURLを指定
$url = explode('/', $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
$url_str ='http://'.$url[0].'/'.$url[1].'/';
$sortset = (string)filter_input(INPUT_GET, 'sort'); //信頼できないのでチェック
?>

<div class="change_bottan_arc">

取り扱い車両:<?php echo $total_results; ?>件<br />

並び替え:
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="newer"/>
    <input type="submit" value="新着順" />
</form>
</form>
<!--|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="older"/>
    <input type="submit" value="古い" />
</form>-->
|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_price_low"/>
    <input type="submit" value="価格が安い" />
</form>

|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_price_high"/>
    <input type="submit" value="価格が高い" />
</form>

|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_km_low"/>
    <input type="submit" value="走行距離が短い" />
</form>

|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_year_new"/>
    <input type="submit" value="年式が新しい" />
</form>

|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_cc_big"/>
    <input type="submit" value="排気量大" />
</form>
|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_cc_small"/>
    <input type="submit" value="排気量小" />
</form>
</div>
    <input type="hidden" name="sort" value="newer"/>
    <input type="submit" value="新着順" />

この部分が基本

あとは

ファンクションに

イズメインクエリを指定してやる

//こっから本番
function SortArchive( $query ) {
 //管理画面スルー	
    if ( is_admin() || ! $query->is_main_query() )
        return;
 //こっから
    if ( $query->is_category() || $query->is_archive() ) {
        $sortset = (string)filter_input(INPUT_GET, 'sort');
        //if ( $sortset != 'older' && $sortset != 'car_price_high' && $sortset != 'car_price_low' ) {
		if ( $sortset == 'new' ) {
            $query->set( 'orderby', 'date' ); //新しい デフォ
        } 
		elseif ( $sortset == 'older' ) { //記事古い
            $query->set( 'orderby', 'date' );
            $query->set( 'order', 'ASC' );
        } 
		elseif ( $sortset == 'car_price_high' ) { //価格高い
            $query->set( 'meta_key', 'car_price' );
            $query->set( 'orderby', 'meta_value_num' );
        } 
		elseif ( $sortset == 'car_price_low' ) { //安い
            $query->set( 'meta_key', 'car_price' );
            $query->set( 'orderby', 'meta_value_num' );
            $query->set( 'order', 'ASC' );
        }
		
			elseif ( $sortset == 'car_km_low' ) { //走行距離が短い
            $query->set( 'meta_key', 'car_km' );
            $query->set( 'orderby', 'meta_value_num' );
            $query->set( 'order', 'ASC' );
        }
		
			elseif ( $sortset == 'car_year_new' ) { //年式が新しい
            $query->set( 'meta_key', 'car_year' );
            $query->set( 'orderby', 'meta_value_num' );
            $query->set( 'order', 'DESC' );
        }
		
			elseif ( $sortset == 'car_cc_big' ) { //排気量大
            $query->set( 'meta_key', 'car_cc' );
            $query->set( 'orderby', 'meta_value_num' );
            $query->set( 'order', 'DESC' );
        }
		
			elseif ( $sortset == 'car_cc_small' ) { //排気量小
            $query->set( 'meta_key', 'car_cc' );
            $query->set( 'orderby', 'meta_value_num' );
            $query->set( 'order', 'ASC' );
        }
        return;
    }
}
add_action( 'pre_get_posts', 'SortArchive' );

こうだ!

空のカスタムフィールどの場合の表示は無視してそのままでるからそこは
制御してない

あとは

カレントを設定するコードを書いたらOKか?

こうした↓
デフォのアーカイブも新着がかれんとされるようにね

<?php //※1 2ページ目以降でボタンを押されても、1ページ目に飛ぶようにURLを指定
$url = explode('/', $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
$url_str ='http://'.$url[0].'/'.$url[1].'/';
$sortset = (string)filter_input(INPUT_GET, 'sort'); //信頼できないのでチェック
?>

<div class="change_bottan_arc">

取り扱い車両:<?php echo $total_results; ?>件<br />

並び替え:
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="newer"/>
<?php if ( $sortset == 'newer' || $sortset == '' ): ?>
    <input type="submit" class="sort_current" value="新着順" />
<?php else: ?>
    <input type="submit" value="新着順" />
<?php endif; ?>
</form>
</form>
<!--|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="older"/>
    <input type="submit" value="古い" />
</form>-->
|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_price_low"/>
    <?php if ( $sortset == 'car_price_low' ): ?>
    
    <input type="submit" value="価格が安い"  class="sort_current" />
    <?php else: ?>
    <input type="submit" value="価格が安い" />
    <?php endif; ?>
</form>

|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_price_high"/>
    <?php if ( $sortset == 'car_price_high' ): ?>
    <input type="submit" value="価格が高い"  class="sort_current" />
        <?php else: ?>
        <input type="submit" value="価格が高い" />
    <?php endif; ?>
</form>

|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_km_low"/>
    <?php if ( $sortset == 'car_km_low' ): ?>
    <input type="submit" value="走行距離が短い"  class="sort_current" />
        <?php else: ?>
        <input type="submit" value="走行距離が短い" />
    <?php endif; ?>
</form>

|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_year_new"/>
    <?php if ( $sortset == 'car_year_new' ): ?>
    <input type="submit" value="年式が新しい"  class="sort_current" />
        <?php else: ?>
         <input type="submit" value="年式が新しい" />
    <?php endif; ?>
</form>

|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_cc_big"/>
    <?php if ( $sortset == 'car_cc_big' ): ?>
    <input type="submit" value="排気量大"  class="sort_current" />
        <?php else: ?>
        <input type="submit" value="排気量大" />
    <?php endif; ?>
</form>
|
<form method="get" action="<?php echo $url_str //※1?>">
    <input type="hidden" name="sort" value="car_cc_small"/>
    <?php if ( $sortset == 'car_cc_small' ): ?>
    <input type="submit" value="排気量小"  class="sort_current" />
        <?php else: ?>
        <input type="submit" value="排気量小" />
    <?php endif; ?>
</form>

cssも書いとく

/*-----------------------並べ替えボタン*/

.change_bottan_arc{ margin-top:20px; margin-bottom:10px;font-size: 80%;}

.change_bottan_arc form{display: inline!important;}

.change_bottan_arc input[type='submit']{
color: #aa9a85;
    padding: 0;
    margin: 0;
    box-shadow: none!important;
    background: none!important;
    border: none!important;
font-size: 100%;
    text-decoration: underline;
    cursor: pointer;
	}
.change_bottan_arc .sort_current{ font-weight: normal!important;
    text-decoration: none!important;
	color:#e60012!important}

切り替え後も 同じページ位置をキープ ページ更新 スクロール位置

[Keep Position] ページのスクロール位置を維持したままフォーム送信やページ切り替えができる jQuery プラグイン

jquery.utility-kit-gh-pages

これの中のいるのは多分
Keep Positionだけだけどセットのやついれた。

うまくいかなかったが
なぜかできた。

完成時
アーカイブ並び替えの
フォームボタンへアサインさせる感じ

干渉かと思いきやそうでなかったっぽい
アーカイブページの
WPフッター前に

<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.3.1/jquery.cookie.min.js"></script>
<script src="/js/jquery.utility-kit.js"></script>
<script type="text/javascript">
// form 要素に対し適用
$('form').keepPosition();
 
// a 要素に対し適用
//$('a').keepPosition();
 
// 現在の URL でリロード
//$.keepPosition.reload();
</script>

としたらできたよ。

投稿日や更新日のクエリdate_query

タックスクエリ
メタクエリ
に続き
発見しましたよ
date_query

クエリポストや
イズメインクエリなどで
重宝しそう

今回の目的は
ソールドアウトと更新した記事は
30日間はループに表示させるが
30日以降は表示させない

という設定で仕様予定

date_query

//投稿日が一年以上前で、一ヶ月以内に更新された記事を取得

$args = array(
	'date_query' => array(
		array(
			'column' => 'post_date_gmt',
			'before' => '1 year ago',
		),
		array(
			'column' => 'post_modified_gmt',
			'after'  => '1 month ago',
		),
	),
	'posts_per_page' => -1,
);
$query = new WP_Query( $args );

省略時は投稿日時(’post_date’)となっている。’column’には’post_date’、’post_date_gmt’、’post_modified’、’post_modified_gmt’、’comment_date’、’comment_date_gmt’が指定できる。

$query = new WP_Query(
array(
‘date_query’=>array(
array(
‘inclusive’=>ture,
‘after’=>date(‘Y/m/d’, strtotime(‘-14 days’)))
)
)
);

http://www.mspace.info/wordpress-4-251.html

くわしくは
http://codex.wordpress.org/Class_Reference/WP_Query

参考

http://elearn.jp/wpman/column/c20131030_01.html

以下
コードの参照になればとコピペ

//サイトを閲覧している日時に更新されたpostを取得

$today = getdate();
$args = array(
	'date_query' => array(
		array(
			'year'  => $today["year"],
			'month' => $today["mon"],
			'day'   => $today["mday"],
		),
	),
);
$query = new WP_Query( $args );


//今週の記事を取得

$week = date('W');
$year = date('Y');
$query = new WP_Query( 'year=' . $year . '&w=' . $week );

//今週の記事を取得

$args = array(
	'date_query' => array(
		array(
			'year' => date('Y'),
			'week' => date('W'),
		),
	),
);
$query = new WP_Query( $args );


日〜土が1〜7に割り当てられています。
日 = 1
月 = 2
火 = 3
水 = 4
木 = 5
金 = 6
土 = 7

//平日(月〜金)9時〜17時に投稿された記事を取得

$args = array(
	'date_query' => array(
		array(
			'hour'      => 9,
			'compare'   => '>=',
		),
		array(
			'hour'      => 17,
			'compare'   => '<=',
		),
		array(
			'dayofweek' => array( 2, 6 ),
			'compare'   => 'BETWEEN',
		),
	),
	'posts_per_page' => -1,
);
$query = new WP_Query( $args );




ソースを見ているとcompareには下記の値が使えそうです。BETWEEN、NOT BETWEENあたりは特に便利そうですね。

'=', '!=', '>', '>=', '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'




続いてもう一つ。afterのように英語表記で年月日指定もできますが、beforeのような指定のほうがわかりやすいと思います。
inclusiveはafter, beforeのみに適用されるtrue/falseの値を取るパラメータで、trueであればafterやbefore自体のマッチした投稿を含む、falseであれば含まない、というパラメータになっています。

//2013/1/1〜2013/2/28に投稿された記事を取得

$args = array(
	'date_query' => array(
		array(
			'after'     => 'January 1st, 2013',
			'before'    => array(
				'year'  => 2013,
				'month' => 2,
				'day'   => 28,
			),
			'inclusive' => true,
		),
	),
	'posts_per_page' => -1,
);
$query = new WP_Query( $args );

http://makeityourself.org/howto/date_query/

アドバンスカスタムフィールドで条件判定とタクソノミーを連動でつまずいた話メモ

アドバンスカスタムフィールドにてタクソノミーをカスタムフィールドに入れて選んでもらえる事ができた。
それだけでもUI?的には大きな進歩であるが

今回やりたかったのは
条件判定にてカスタムフィールドを追加する
メーカーを選択 車種を選択

のメーカーをカスタムフィールドではリストカテゴリで一覧できないために
タクソノミーにしたかった。
だが現在アドバンスカスタムフィールドはタクソノミーの条件判定はできない。

結局プログラムを改造出来る程度で
プログラマではないため
プログラマの恩恵をうけているプログラムカスタマーといったところか。
自分でプログラムを書けるまでいくとすごいだろうな。。

さて

そのため 今回 車種名はあきらめて
テキストフィールドにする。
どうせ車種ではリスト表示しない予定のため
(専門店などではそもそも別のタクソノミーを用意するだろう)

ただおしかったので
どこができなかったかを
書き留めよう。

管理画面にて
タクソノミー(フィールド car_maker)とカスタムフィールド(フィールド car_maker)
同じにし
タクソノミーをカテゴリ作成し
アドバンスカスタムフィールドでセレクトボックスを作成

その際、
【タクソノミーのセレクトを カスタムフィールドのセレクトに連動】

できれば車種名フィールドは変更表示される事ができるだろう。
ここがにた様なコードをかいている人がいたが
難しかったことと
時間的に断念。

http://yahss.net/wordpress/1302-synchronize-tax-with-customfield/

なんとなくわかるが
これを自前に改造したら1日はかかるかできないかも

その他、同じセレクトボックスの連動で

http://okwave.jp/qa/q5903448.html

このような記事があったが
同じく断念

また時間と余裕があるときにでも

メモとして
タームIDが 33のとき セレクトボックスを  33:ターム名
の様にすればどちらも連動するようだ。

この場合 タクソノミーの方が優位なので(仕様)
タクソノミー 更新 とやれば メーカーも変わり 車種名がでる
今回やりたかった事ができるが
ユーザービリティ的に却下。