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();では取得できないんですね。

忘れないようにメモ。