/ / To samo zapytanie, inne wyniki. Wordpress orderby - php, mysql, wordpress, order

To samo zapytanie, inne wyniki. Wordpress orderby - php, mysql, wordpress, order

W mojej witrynie wordpress mam posty uporządkowane według niestandardowego pola (_recommended) w mojej tabeli wp_postmeta:

|| *meta_id* || *post_id* || *meta_key* || *meta_value* ||
|| 24948 || 496 || _recommended || 15 ||
|| 25460 || 1323 || _recommended || 45 ||
|| 25972 || 1632 || _recommended || 200 ||

Robię to, przekazując argumenty do WP_Query:

$args = array(
"meta_key" => "_recommended",
"orderby" => "meta_value_num",
"order" => "DESC",
"posts_per_page" => $wp_query->get("posts_per_page"),
"paged" => $paged
);
$query = new WP_Query( $args );

Po pewnym czasie zauważyłem, że moje zamówienie pocztoweciągle się przełącza. Wywołałem więc echo nieprzetworzonego SQL WP Query i wykonałem go kilka razy przy pomocy mojego programu SQL, ale widzę, że kolejność pobierania identyfikatora ciągle się zmienia, mimo że jest to dokładnie to samo zapytanie. Tutaj surowe zapytanie SQL, które tworzy inną kolejność postów:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN
wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND
wp_posts.post_type = "post" AND (wp_posts.post_status = "publish") AND (
wp_postmeta.meta_key = "_recommended" ) GROUP BY wp_posts.ID ORDER BY
wp_postmeta.meta_value+0 DESC LIMIT 77, 11

Odpowiedzi:

0 dla odpowiedzi № 1

Najprawdopodobniej to, co się dzieje, to to, co maszwiele postów o tej samej wartości dla _recommended. Ponieważ sortujesz tylko na _recommended, nie ma gwarancji, że pojawi się wiele postów.

WordPress nie pozwala na sortowanie według wartości meta_wartość i klucza bezpośrednio, ale możesz to zrobić za pomocą filtru, jeśli chcesz mieć spójną kolejność, np. według ID.

add_filter( "posts_orderby", "do_posts_orderby" );
$query = new WP_Query( array(
"meta_key" => "_recommend",
"orderby" => "ID",
"order" => "ASC",
) );
remove_filter( "posts_orderby", "do_posts_orderby" );

function do_posts_orderby( $orderby )
{
global $wpdb;
$orderby = $wpdb->postmeta . ".meta_value_num DESC, " . $orderby;
return $orderby;
}

Dodaje to dodatkową wartość do posortowania według klauzuli OrderBy.