В get_posts юзать
fields => ids, чтобы на выходе был не огромный массив объектов (постов), а простой массив id-шников - всё равно кроме id больше ничего не нужно будет в цикле - экономия памяти!
заюзать WP-CLI для того чтобы всю эту обработку реордеинга запустить первый раз
ну и далее можно навесить hook например на save_post, который будет проверять загружен ли thumbnail для товара и если да - то реордерить позицию товара
можно еще разобраться в том где и как в таблицах WordPress'а хранится связка между постом (товаром) и главным его изображением (thumbnail) и соотв. через хук для фронт-части сайта изменить главный query-запрос с учетом этой сортировки
я вот менял сортировку кастомной таксономии в админке - по похожему принципу:
add_filter( 'terms_clauses', function ( $pieces, $taxonomies, $args ) {
global $pagenow, $wpdb;
if ( is_admin() && $pagenow == 'edit-tags.php' && $taxonomies[0] == 'program_session' ) {
$pieces['join'] .= ' INNER JOIN ' . $wpdb->termmeta . ' AS tm ON t.term_id = tm.term_id ';
$pieces['where'] .= ' AND tm.meta_key = "program_session_start"';
$pieces['orderby'] = ' ORDER BY tm.meta_value ';
}
return $pieces;
}, 10, 3 );
у вас другой случай - но подход возможно похожий
https://wp-kama.ru/hook/posts_clauses
UPD: по-моему вот ответ на ваш вопрос:
https://stackoverflow.com/questions/15956135/how-c...