У меня упрощенный вариант работает
add_filter( 'pre_get_posts' , 'my_change_order' );
function my_change_order( $query ) {
if($query->is_main_query() && !is_admin()) {
$query->set( 'orderby' , 'meta_value_num' );
$query->set( 'meta_key', 'sort');
$query->set( 'order', 'ASC');
}
}
Видимо, «неконтакт» где-то в условиях, получается false на каком-то этапе 🙂
вывел wp_query получил вот что
[request] => SELECT wp_posts.* FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (1) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND (wp_postmeta.meta_key = 'cp-term-id-1' ) GROUP BY wp_posts.ID ORDER BY wp_posts.menu_order ASC
Воспроизвести сложно вашу ситуацию, нет полных исходников, но такой код работает для архивов категорий:
add_filter( 'pre_get_posts' , 'my_change_order' );
function my_change_order( $query ) {
if ( $query->is_main_query() && !is_admin() ) {
$cat = (get_query_var('cat')) ? get_query_var('cat') : 0;
if ( $cat ) {
$query->set( 'orderby' , 'meta_value_num' );
$query->set( 'meta_key', 'sort');
$query->set( 'order', 'ASC');
$query->set( 'posts_per_page', -1 ); //??
}
}
}
1. Основное отличие в том, что у вас есть еще выбор опции из некой настройки и её проверка
if ($check_option=='true') { //Почему сравнение со строкой?
и то, что вы работаете с term_id.
2. И действительно ли существуют ключи, типа cp-term-id-
??
1. потому что в опции строка ‘true’
2. да конечно существуют первым делом проверил)
дело в том что именно order не срабатывает, т.к. если например меняю ‘posts_per_page’ на 1 то выводится 1 запись