welcart 商品一覧を品番でソートできるようにする
参考:「welcartの商品を在庫や価格で絞り込み&並べ替えする。」
こちらの記事を参考に実装してみました。
functions.php
function custom_sort_itemcode( $query ) {
if ( is_admin() || !$query->is_main_query() )
return;
if ( $query->is_search ) {
set_query_var('post_type', 'post');
}
if ( $query->is_category() || $query->is_tag() || $query->is_search() ) {
$args = array();
$sort = isset($_GET['sort']) && is_string($_GET['sort']) ? $_GET['sort'] : '';
if ( $sort ) {
if ( $sort == 'item_code_asc' ) {
add_filter( 'posts_join', 'my_join' );
add_filter( 'posts_orderby', 'custom_orderby_asc');
} elseif ( $sort == 'item_code_desc' ) {
add_filter( 'posts_join', 'my_join' );
add_filter( 'posts_orderby', 'custom_orderby_desc');
} elseif ( $args ) {
$query->set( $args );
}
}
}
}
add_action( 'pre_get_posts', 'custom_sort_itemcode', 10, 1 );
function my_join( $join ) {
global $wpdb;
$item_table = usces_get_tablename( 'usces_item' );
$join .= " INNER JOIN {$item_table} AS welitem ON {$wpdb->posts}.ID = welitem.post_id";
return $join;
}
// 品番を取得 小さい順
function custom_orderby_asc($orderby) {
global $wpdb;
$orderby = 'welitem.itemCode ASC';
return $orderby;
}
// 品番を取得 大きい順
function custom_orderby_desc($orderby) {
global $wpdb;
$orderby = 'welitem.itemCode DESC';
return $orderby;
function custom_sort_query( $url ) {
if( isset( $_GET['sort'] ) ) $url = add_query_arg( 'sort', $_GET['sort'], $url );
return $url;
}
add_filter( 'paginate_links', 'custom_sort_query', 10 );
add_filter( 'term_link', 'ucustom_sort_query', 10 );
category.php(またはarchive.php)、search.php
<?php
$current_url = (empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
$sort = isset($_GET['sort']) && is_string($_GET['sort']) ? $_GET['sort'] : '';
foreach ( array( 'item_code_asc'=>'昇順','item_code_desc'=>'降順' ) as $key => $val ):
$sort_option[ $key ] = "\t\t\t" .'<a class="sort_select_option'. ( $sort == $key ? ' selected': '' ).'" value="'.$key.'" href="'.( $key == 'date' ? remove_query_arg( 'sort', $current_url ) : add_query_arg( 'sort', $key, $current_url ) ).'" data-target="'.$key.'">' .$val. '</a>'. "\n";
endforeach; ?>
<select class="sort_select">
<option value="item_code_asc" data-url="<?php echo add_query_arg( 'sort', 'item_code_asc', $current_url ); ?>"<?php echo ( $sort == 'item_code_asc' ? ' selected': '' ); ?>>昇順</option>
<option value="item_code_desc" data-url="<?php echo add_query_arg( 'sort', 'item_code_desc', $current_url ); ?>"<?php echo ( $sort == 'item_code_desc' ? ' selected': '' ); ?>>降順</option>
</select>
<script type="text/javascript" charset="utf-8">
jQuery( 'select.sort_select' ).change(function() {
window.location = jQuery( this ).find( 'option:selected' ).data( 'url' );
});
</script>
最初何度やっても品番が取得できず匙を投げそうでしたが「Welcart 2.7 のためのカスタマイズ修正」を確認したところ、自分の記述が古いことに気が付きました。
2.7からは$query->set();では取得できないんですね。
忘れないようにメモ。