А все, в phpmyadmin на тыкал по колонкам как нужно, даже и думать не пришлось и получился такой вариант
SELECT wp_posts.ID, wp_posts.post_title, wp_posts.post_date, wp_postmeta.meta_value FROM wp_posts
LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'pinned'
WHERE wp_posts.post_type = 'partners'
ORDER BY `wp_postmeta`.`meta_value` DESC, `wp_posts`.`ID` DESC LIMIT 25
Хоть он конечно и не покрывает 100% задачу так как тут сортировка все равно общая какая то получается, мы сначала поднимает закрепленные а потом сортируем всё по ID, хотелось бы иметь возможность сортировать отдельно поднятые и все остальные по разному
============ UPDATED ============
За два дня поисков нашел еще такой вариант, в целом тоже работает и отвечает на 1-ую часть задания, тут я уже сам себе признал что так себе знал о всех доступных способах указания аргументов в WP_Query, так как до этого в основном пользовался только стандартными кейсами
$posts_query = new WP_Query([
'paged' => $paged,
'post_type' => 'post',
'post_status' => 'publish',
'suppress_filters' => true,
'posts_per_page' => $posts_per_page,
'meta_query' => [
'relation' => 'OR',
'pinned_clause' => [
'key' => 'pinned',
'compare' => 'EXISTS',
],
],
'orderby' => [
'pinned_clause' => 'DESC',
'ID' => 'DESC',
],
]);
Осталось найти способ как выполнить 2-ую часть задания, хотя предполагаю что можно где то в цикле после того как отрисовал закрепленные менять query параметр orderby на нужный, главное отловить тот момент когда идут не закрепленные, наверно по кол-ву можно брать, заранее посчитать сколько всего закрепленных и после в цикле уже проверять
Далее по всей видимости нужно изучать как делать сложные meta_query что бы комбинировать relation по типу этого
$post_query = new WP_Query([
// ...
'meta_query' => [
'relation' => 'AND',
[
'relation' => 'OR',
'pinned_clause' => [
'key' => 'pinned',
'compare' => 'EXISTS',
],
],
[
'relation' => 'AND',
[
'key' => 'acf_field_1',
'value' => 'filtering_value_1',
],
[
'key' => 'acf_field_2',
'value' => 'filtering_value_2',
],
],
],
]);