Сортуйте за мета-значенням, але включайте дописи, у яких його немає


37

Я модифікував вбудований WP пошук за допомогою pre_get_posts фільтра, дозволяючи користувачеві сортувати публікації (включаючи купу спеціальних типів публікацій) за різними полями.

Проблема, яка у мене є, полягає в тому, що коли я скажу WP сортувати за мета-значенням, вона виключить усі повідомлення, у яких не встановлено мета-значення. Це призводить до зміни кількості результатів, якщо ви змінюєте сортування з "Показник" на "Дата", оскільки для "Постів" не встановлено "Ціна", а "Елементи".

Це не те, що я хочу, тому я хотів би знати, чи існує спосіб включення ВСІХ дописів - навіть тих, у яких відсутня метазначення, на яке я сортую - і ставити те, що не має значення, останнє.

Я знаю, як сортувати по декількох полях, але це не допомагає.

Спасибі

Здається, я не єдиний із цим питанням: Спосіб включення дописів з & без певного meta_key в аргументи для wp_query? але рішення там немає.

Оновлення

Я спробував відповідь, але не впевнений, чи правильно зрозумів, ось що у мене зараз:

<?php
function my_stuff ($qry) {
    $qry->set('meta_query', array(array(
        'key' => 'item_price', 
        'value' => '', 
        'compare' => 'NOT EXISTS'
    )));

    $qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
    $qry->set('order', 'ASC DESC');
    $qry->set('meta_key', 'item_price');
}

Мета значення - це число (воно використовується для зберігання ціни, як підказує назва)

Оновлення 2

Я прокоментував замовлення та все, що зараз у мене, це таке:

<?php
$qry->set('meta_query', array(array(
    'key' => 'item_price', 
    'value' => '', 
    'compare' => 'NOT EXISTS'
)));

За допомогою цього коду запит, схоже, повертає всі повідомлення, у яких немає item_priceключа, і жодна з публікацій, у яких він є. IE проблема тепер обернена.

Якщо я також додаю код-замовлення, я отримую 0 результатів.

Редагувати: ... через три роки ... : PI знову випустив цю проблему. Я спробував усі відповіді, і жодна робота не отримала. Не впевнений, чому деякі люди, здається, думають, що працюють, але принаймні для мене вони не працюють.

Рішення, в якому я закінчився, - це використання save_post фільтр - переконайтесь, що всі публікації мають спеціальне поле, за яким я хочу сортувати. Це трохи дратує, що я маю це робити, але до тих пір, поки ви зробите це рано, у вас, швидше за все, проблем не буде.

У цьому випадку я будував "лічильник перегляду" для публікацій і хотів, щоб користувачі мали змогу сортувати по самих прочитаних публікаціях. Знову ж таки, публікації, які ніколи не переглядалися (напевно, це малоймовірно - але все-таки) зникали під час сортування за кількістю переглядів. Я додав цей біт коду, щоб переконатися, що кількість публікацій має кількість переглядів:

add_action('save_post', function ($postId) {
    add_post_meta($postId, '_sleek_view_count', 0, true);
});

Будь ласка, покажіть нам свій код. Полегшує відповідь.
кайзер

По- перше: meta_queryі tax_queryце завждиarray( array() ) , як вони поєднують в собі кілька масивів. Друге - як було сказано у моїй відповіді - потрібно використовувати meta_value_numдля чисел. Це може знадобитися і для фактичного визначення meta_value_num(див. WP_QueryЗапис на сторінці -Codex). Нарешті, це не має сенсу orderв ASC і DESC напрямок. Це неможливо. Розділювач простору працює лише для цього, orderbyі ви не можете сказати йому, щоб сортувати перше ASCта друге DESC. Ось для чого призначений posts_clausesфільтр.
кайзер

І переконайтеся, що ваші meta_value_numзаписи справжні . Бачив це занадто часто, щоб хтось заявляв, що це число, але насправді зберігає його як рядок у базі даних.
кайзер

Дякую за вашу допомогу, я спробую це і повернусь до вас. Причина ASC DESCв тому, що вона сортує meta_valueв ASCі dateв DESC, наскільки я можу сказати, це працює.
powerbuoy

1
@Howdy_McGee це правильно. Деякі з моїх користувацьких типів публікацій мають це значення. Деякі ні. А вбудовані типи публікацій (як POST та PAGE) не роблять. Отож, коли я намагаюся сортувати за цим спеціальним полем, відображатимуться лише повідомлення із спеціальним полем.
powerbuoy

Відповіді:


4

Є два можливі рішення для цього:

1. Усі повідомлення мають мета

Найкраще рішення, яке я знайшов тут, - дати решті публікацій / продуктів ціна товару в розмірі 0. Ви можете це зробити вручну або прокрутити всі повідомлення, і якщо ціна порожня, то оновіть її.

Щоб зробити це керованим у майбутньому, ви можете підключитись save_postі надати їм значення під час їх першого додавання (лише якщо він порожній).

2. Кілька запитів

Ви можете запустити перший запит під час роботи та зберігати ідентифікатори повернених публікацій. Потім можна запустити інший запит для всіх публікацій та дати замовлення, виключаючи повернення ідентифікаторів із першого запиту.

Потім ви можете роздрукувати два результати окремо, і отримаєте бажані результати.


1
Через три роки, і у мене знову виникло те саме питання: P Довелося використовувати save_postметод (я оновив своє запитання кодом, який я використав).
powerbuoy

10

Легкий горох, щойно перевірений 2018 рік, використовуючи у виробництві зараз.

$query->set( 'meta_query', array(
    'relation' => 'OR',
    array(
        'key' => 'custom_meta_key', 
        'compare' => 'EXISTS'
    ),
    array(
        'key' => 'custom_meta_key', 
        'compare' => 'NOT EXISTS'
    )
) );
$query->set( 'orderby', 'meta_value title' ); 

Це перевіряє всі елементи з мета-клавішею і без неї, без вказаного значення. мета-запит надійно забезпечує ключ для замовлення. Це було випробувано. Я не впевнений, однак, як він працюватиме, коли мета-запит використовує кілька клавіш.

Практичний приклад

/**
 * Modifies query before retrieving posts. Sets the 
 * `meta_query` and `orderby` param when no `orderby` 
 * param is set, (default ordering).
 * 
 * @param   WP_Query  $query  The full `WP_Query` object.
 * @return  void
 */
function example_post_ordering( $query ) {

    // if not in wp-admin, 
    // and the query is the main query, 
    // and the query is not a singular query, 
    // and the query does not have an orderby param set...
    // Note: check for post types, etc. here as desired.
    if ( ! is_admin() 
    && $query->is_main_query() 
    && ! $query->is_singular() 
    && empty( $query->get( 'orderby' ) ) ) {

        // Setting just `meta_key` is not sufficient, as this 
        // will ignore posts that do not yet, or never will have 
        // a value for the specified key. This meta query will 
        // register the `meta_key` for ordering, but will not 
        // ignore those posts without a value for this key.
        $query->set( 'meta_query', array(
            'relation' => 'OR',
            array(
                'key' => 'custom_meta_key', 
                'compare' => 'EXISTS'
            ),
            array(
                'key' => 'custom_meta_key', 
                'compare' => 'NOT EXISTS'
            )
        ) );

        // Order by the meta value, then by the title if multiple 
        // posts share the same value for the provided meta key.
        // Use `meta_value_num` if the meta values are numeric.
        $query->set( 'orderby', 'meta_value title' );
    }

}

add_action( 'pre_get_posts', 'example_post_ordering', 10 );

Це впорядкує публікації за custom_meta_keyзамовчуванням і не буде ігнорувати публікації без значення для цього ключа.


Щойно з читання коду, все, що, здається, робиться - це отримувати повідомлення, які є, custom_meta_keyі отримувати повідомлення, яких не має custom_meta_key. Не соромтеся включати фактичний робочий приклад із сортуванням.
powerbuoy

1
Ви маєте рацію, це все, що він робить, але рядок нижче відповідає за впорядкування мета_значення (мета-ключа, що запитується). $query->set( 'orderby', 'meta_value title' );(Упорядкувати за мета значенням, а потім за заголовком, коли для декількох публікацій однакове значення має мета-ключ). Це слід зробити в pre_get_postsгачку, використовуючи передану в $queryзмінній. Пам’ятайте, що поставлене запитання полягало в тому, як замовити мета-значення, не ігноруючи публікації, які не мають значення для цього мета-ключа.
noahmason

@powerbuoy Дивіться оновлений практичний приклад
noahmason

Гаразд, я піду наступному разу, коли я зіткнуся з цією проблемою.
powerbuoy

1
Працював для мене в користувацькому get_posts()дзвінку, щоб перенести повідомлення _featuredдо вершини, а потім замовити за датою після цього. Спасибі!
natebeaty

8

Цей метод поверне всі публікації, включаючи запитання із запитом та без meta_key, але він буде робити дивні речі при замовленні.

add_action('pre_get_posts', 'my_stuff');
function my_stuff ($qry) {
    $qry->set(
        'meta_query',
        array(
            'relation' => 'OR', # Matches to this meta_query should be added to those matching the 'meta_key' query
            array(
                'key' => 'item_price', 
                'value' => 'bug #23268', 
                'compare' => 'NOT EXISTS'
            )
        )
    );

    $qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
    $qry->set('order', 'ASC DESC');
    $qry->set('meta_key', 'item_price');
}

Я виявив це, обмінюючись усіма різними відповідями на це питання та аналізуючи сформований SQL за допомогою проб і помилок. Здається, що налаштування array('meta_query' => array('relation' => 'OR'))виводить відповідне LEFT JOINзамість INNER JOINцього, щоб включити повідомлення, у яких відсутні метадані. Вказівка NOT EXISTSзапобіжного WHEREзастереження від фільтрації повідомлень, у яких відсутнє метаполе. Для цього WP_Query, згенерований SQL є (додані відступи / нові рядки):

SELECT SQL_CALC_FOUND_ROWS
    wp_posts.ID
    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
    LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id AND mt1.meta_key = 'item_price')
    WHERE 1=1
    AND ( wp_term_relationships.term_taxonomy_id IN (2) )
    AND wp_posts.post_type = 'post'
    AND (wp_posts.post_status = 'publish'
        OR wp_posts.post_status = 'private')
    AND (wp_postmeta.meta_key = 'item_price'
        -- Oh look, here we give SQL permission to choose a random
        -- row from wp_postmeta when this particular post is missing
        -- 'item_price':
        OR  mt1.post_id IS NULL )
    GROUP BY wp_posts.ID
    ORDER BY wp_postmeta.meta_value,wp_posts.post_date DESC
    LIMIT 0, 10

Результат - перелік усіх публікацій з мета_значенням item_priceта тих, які відсутні item_price. Усі публікації з item_priceвпорядкованими будуть правильно відносно один одного, але повідомлення, які відсутні item_price, використовуватимуть якусь випадкову іншу мета-величину (скажімо, _edit_lastщо, як видається, є 1досить часто в моїй базі даних або в інших внутрішніх метаданих wordpress, які є абсолютно довільними) для її wp_postmeta.meta_valueв ORDER BYстановище. Отже, хоча цей метод близький і може здатися, що він працює для певних даних, він порушується. Отже, все, що я можу сказати, - якщо ваші item_priceзначення не суперечать випадковим метаполям, які MySQL обирає для відсутніх постів item_price, це може спрацювати для вас. Якщо все, що вам потрібно, - це гарантія, що ваші публікації зitem_priceправильно впорядковані відносно один одного, не враховуючи впорядкування інших постів, можливо, це буде добре. Але я думаю, що це лише недолік у wordpress. Виправте мене, я сподіваюся, що я помиляюся, і є спосіб вирішити це ;-).

Схоже, що для INNER JOIN wp_postmetaMySQL вибирає випадковий рядок з декількох postmetaрядків, пов’язаних із публікацією, коли meta_keyвідсутня дана публікація. З точки зору SQL, нам потрібно розібратися, як сказати Wordpress на вихід ORDER BY mt1.meta_value. Цей стовпець є належним чином, NULLколи наш запит meta_keyвідсутній, на відміну від цього wp_postmeta.meta_value. Якби ми могли це зробити, SQL сортував би ці NULL(відсутні записи) перед будь-яким іншим значенням, даючи нам чітко визначений порядок: спочатку приходять усі повідомлення, у яких відсутнє конкретне поле постмета, вдруге - повідомлення, що мають поле. Але в цьому вся проблема: 'orderby' => 'meta_value'може ставитися тільки до 'meta_key' => 'item_price' і unaliased wp_postmetaзавжди є INNER JOINзамість коли - або LEFT JOIN, маючи в увазі wp_postmeta.meta_valueі wp_postmeta.meta_keyможе ,ніколи не бути NULL.

Тому я думаю, що я маю сказати, що це неможливо із вбудованою програмою wordpress, WP_Queryяк це зараз задокументовано (у wordpress-3.9.1). Набридати. Отже, якщо вам насправді це потрібно для коректної роботи, вам, ймовірно, потрібно зачепитись у wordpress в іншому місці та змінити створений SQL безпосередньо .


Виглядає дуже перспективно! Я спробую це наступного разу, коли у мене виникне це питання. Я хотів би дати вам відповідь прямо зараз, але хотів би спочатку підтвердити, чи працює він для мене.
powerbuoy

Це не дало мені проявитись. Нічого не виявилося після цього.
Джейк

@Jake Yea ж тут. Була сьогодні ця проблема знову і спробувала це. Повертає 0 результатів.
powerbuoy

Яку версію Wordpress ви використовуєте? Я думаю, що у цій публікації описано, як використовувати внутрішній, незадокументований API, який не підтримується wordpress, і тому, ймовірно, працює лише в тому випадку, якщо ви користуєтеся wordpress-3.9.1 або не надто багато версій поза цим.
бінкі

2

Я думаю, що у мене є рішення.

Ви можете використовувати два meta_keys, один, який є у всіх публікаціях (like "_thumbnail_id"), і meta_keyви хочете використовувати як фільтр.

Отже, ваші аргументи:

$qry->set(
    'meta_query',
    array(
        'relation' => 'OR',
        array(
            'key' => 'item_price', 
            'value' => '', 
            'compare' => 'EXISTS'
        ),
        array(
            'key' => 'item_price', 
            'value' => '', 
            'compare' => 'EXISTS'
        )
    )
);

$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');

1
Проблема тут - порівняння порожніх рядків, видаліть його, і воно 'value' => '', також працює, і друге порівняння повинно бути, NOT EXISTSі остання інструкція набору не потрібна
киває

2

Проблема, з якою стикаються всі тут, пов'язана з порядком мета запитів. Для того, щоб правильно сортувати, вам потрібно поставити запит "НЕ ІСНУЄ" перед запитом "ІСНУЮЧІ".

Причиною цього є те, що WordPress використовує мета_значення останнього оператора "LEFT JOIN" у пункті "ORDER BY".

Наприклад:

$pageQuery = new WP_Query([
    'meta_query' => [
        'relation' => 'OR',
        ['key' => 'item_price', 'compare' => 'NOT EXISTS'], // this comes first!
        ['key' => 'item_price', 'compare' => 'EXISTS'],
    ],
    'order' => 'DESC',
    'orderby' => 'meta_value_num',
    'post_status' => 'publish',
    'post_type' => 'page',
    'posts_per_page' => 10,
]);

1

Якщо потрібно, ви можете додавати мета-значення за замовчуванням щоразу, коли повідомлення зберігається чи оновлюється, якщо мета-значення не існує.

function addDefaultMetaValue($post_id) {
    add_post_meta($post_id, 'item_price', 0, true);
}
add_action('save_post', 'addDefaultMetaValue');

Якщо ви використовуєте спеціальний тип публікації, замініть на add_action('save_post', 'addDefaultMetaValue');, add_action('save_post_{post_type}', 'addDefaultMetaValue');наприклад,add_action('save_post_product', 'addDefaultMetaValue');


1

У мене виникли проблеми щодо числових мета-значень і зазначив, що в ній важливий також порядок запиту. Для мене NOT EXISTSзапит має бути першим.

Приклад:

$query->set( 'orderby', 'meta_value_num' );
$query->set( 'meta_query', [
    'relation' => 'OR',
    [ 'key' => 'your_meta_name', 'compare' => 'NOT EXISTS' ],
    [
        'key' => 'your_meta_name',
        'compare' => 'EXISTS',
    ],
] );

Також важливим для отримання правильного напряму для числових значень є загальне значення ’orderby’для встановлення ’meta_value_num’. Інакше у вас є дивні результати для числових значень, наприклад:

1, 2, 20, 21, 3, 4, 5…

Замість:

1, 2, 3, 4, 5… 20, 21


1

Я також зіткнувся з подібною проблемою, і наступне рішення мені допомогло:

$args = array(
'post_type' => 'kosh_products',
'posts_per_page' => -1,
'meta_query' => array(
    'relation' => 'OR',
    'category_sort_order' => array(
        'key' => '_sort_order',
        'compare' => 'EXISTS'
    ),
    'category_sort_order_not_exists' => array(
        'key' => '_sort_order',
        'compare' => 'NOT EXISTS'
    ), 
),
'orderby' => array( 
    'category_sort_order' => 'ASC',
    'date' => 'ASC'
));
$query = new WP_Query( $args );

Я знайшов опис WordPress Codex з заголовком " " orderby "з декількома" meta_key ": https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters введіть тут опис зображення


0

Для цього існує можливе orderbyзначення meta_value.

$query = new WP_Query( array ( 
    'meta_key'   => 'your_keys_name',
    'orderby'    => 'meta_value',
    'order'      => 'DESC',
    'meta_query' => array( array(
         'key'     => 'your_meta_key',
         'value'   => '',
         'compare' => 'NOT EXISTS',
         // 'type'    => 'CHAR',
    ) )
) );

Якщо ви отримали числові значення, просто використовуйте meta_value_numзамість цього.

Відмова: Це не перевірено, але воно має працювати. Справа в тому, що вам потрібно вказати свої meta_keyта keyзначення. Інакше ви не можете порівнювати з неіснуючими значеннями, що повинно давати можливість запитувати обидва типи публікацій. Це якийсь хак-іш, але поки це працює ...


Дякую за вашу відповідь, будь ласка, перевірте моє оновлене запитання, я не впевнений, що я вас правильно зрозумів.
powerbuoy

Я досі не зробив цю роботу, тому якщо у вас є рішення, я хотів би знати, що я роблю неправильно. Крім того , я встановив нагороду на SO , якщо ви хочете затребувати його: stackoverflow.com/questions/17016770 / ...
powerbuoy

1
Дві речі. 'your_keys_name'і вони 'your_meta_key'повинні бути однаковою ланцюжкою, а не чіткою, інакше це здається, що ви неправильно зрозуміли питання. По-друге, я перевірив це на своїх локальних налаштуваннях, і це виключає будь-які повідомлення, де існує ключ (через meta_query), і виключає будь-які повідомлення, де ключ відсутній (через meta_key), в результаті чого жодних публікацій не відображається. Однак ця відповідь - це крок до чогось, що, принаймні , слів ;-).
binki

1
О, цікаво, ця відповідь дійсно працює , якщо ви просто додати 'relation' => 'OR'до meta_query. Хитрі речі о_о.
binki

@binki Просто надішліть правки на моє запитання та змініть біти, які, на вашу думку, слід змінити. Це сайт, керований спільнотою :)
kaiser

0

Я думаю , що @kaiser намагався зробити , це сказати запит , щоб повернути всі повідомлення , які мають цей ключ мета шляхом застосування свого роду манекен , де умова , щоб НЕ фільтрувати будь-який з цих постів. Отже, якщо ви знаєте всі значення, які можуть прийняти ваші користувацькі поля, це x, y, z, ви можете сказати "WHERE meta_key IN (x, y, z) ", але ідея полягає в тому, що ви можете уникнути цієї проблеми разом, сказавши ! = (' ') :

$query = new WP_Query( array ( 
    'orderby'    => 'meta_value_num',
    'order'      => 'DESC',
    'meta_query' => array( array(
         'key'     => 'item_price',
         'value'   => '',
         'compare' => '!=',
    ) )
) );

Також не перевірена, але відчуває, що варто спробувати :-).


1
Неможливо перевірити це зараз, але впевнений, що він повертатиме повідомлення лише там, де встановлено item_price, а це не ''.
powerbuoy

0

Я в кінцевому підсумку обійшов це трохи злом (IMHO), але це зробило роботу для мене в моєму випадку.

Ви можете підключити до фільтрів posts_join_paged та posts_orderby, щоб оновити рядки з'єднання та замовлення. Це дозволить вам замовити все, що завгодно, доки ви приєднаєтесь до нього, а не WP_Query, припускаючи, що поле має існувати саме для цієї посади. Потім можна видалити meta_key,orderby і `замовлення від ваших аргументів WP_Query.

Нижче наведено приклад. У верхній частині кожної функції мені довелося вийти з певних випадків, оскільки це додасть це до всього, що використовує WP_Query. Можливо, вам доведеться змінити це відповідно до ваших потреб.

Документації на ці два фільтри, на жаль, бракує, тому ... удачі! :)

add_filter('posts_join_paged', 'edit_join', 999, 2);
add_filter('posts_orderby', 'edit_orderby', 999, 2);

/**
 * Edit join
 *
 * @param string $join_paged_statement
 * @param WP_Query $wp_query
 * @return string
 */
function edit_join($join_paged_statement, $wp_query)
{
    global $wpdb;
    if (
        !isset($wp_query->query)
        || $wp_query->is_page
        || $wp_query->is_admin
        || (isset($wp_query->query['post_type']) && $wp_query->query['post_type'] != 'my_custom_post_type')
    ) {
        return $join_paged_statement;
    }

    $join_to_add = "
        LEFT JOIN {$wpdb->prefix}postmeta AS my_custom_meta_key
            ON ({$wpdb->prefix}posts.ID = my_custom_meta_key.post_id
                AND my_custom_meta_key.meta_key = 'my_custom_meta_key')
    ";

    // Only add if it's not already in there
    if (strpos($join_paged_statement, $join_to_add) === false) {
        $join_paged_statement = $join_paged_statement . $join_to_add;
    }

    return $join_paged_statement;
}

/** 
 * Edit orderby
 *
 * @param string $orderby_statement
 * @param WP_Query $wp_query
 * @return string
 */
function edit_orderby($orderby_statement, $wp_query)
{
    if (
        !isset($wp_query->query)
        || $wp_query->is_page
        || $wp_query->is_admin
        || (isset($wp_query->query['post_type']) && $wp_query->query['post_type'] != 'my_custom_post_type')
    ) {
        return $orderby_statement;
    }

    $orderby_statement = "my_custom_meta_key.meta_value DESC";

    return $orderby_statement;
}

Код працює. Але мета_значення обробляється як рядок. Таким чином, 6 оцінюється вище як 50. Чи можливі будь-які модифікації, щоб трактувати їх як числа?
Drivingralle

@Drivingralle cast(my_custom_meta_key.meta_value as unsigned) DESCповинен зробити трюк ...
tfrommen

1
Дякую @tfrommen $orderby_statement = "cast(my_custom_meta_key.meta_value as unsigned) DESC";чудово працює.
Drivingralle

0

Це рішення працювало для мене:

add_action( 'pre_get_posts', 'orden_portfolio' );
function orden_portfolio( $query ) {

    if( ! is_admin() ) {

        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'order', 'ASC' );
        $query->set( 'meta_query', [
            'relation' => 'OR',
            [ 
                'key' => 'ce_orden', 
                'compare' => 'NOT EXISTS' ],
            [
                'key' => 'ce_orden',
                'compare' => 'EXISTS',
            ],
        ] );

        return $query;

    }

}

Однак це рішення спочатку показує записи з нульовим мета_значенням. Це інше рішення показує порядок ASC та нулі в кінці:

function custom_join($join) {
    global $wpdb;

    if( ! is_admin() ) {
        $join .= $wpdb->prepare(
        ' LEFT JOIN ' . $wpdb->postmeta . ' cpm ON cpm.post_id = ' . $wpdb->posts . '.ID AND cpm.meta_key = %s'
        , 'ce_orden' );
    }

    return $join;
}

add_filter('posts_join','custom_join');

function custom_orderby($orderby_statement){
    global $wpdb;

    if ( ! is_admin() ) {
        $orderby_statement = "CAST( COALESCE(cpm.meta_value,99999) as SIGNED INTEGER) ASC";
    }

    return $orderby_statement;
}

add_filter('posts_orderby','custom_orderby', 10, 2 ); 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.