wtyczki – klucze meta WP_Query i NULL
Mam kilka niestandardowych postów z dwoma kluczami meta – _claimed
I _average_rating
. The _average_rating
jest dodawany jako klucz meta tylko wtedy, gdy ktoś zostawi ocenę w poście i _claimed
meta klucz jest ustawiony na 1 tylko wtedy, gdy użytkownik zgłasza prawa do wpisu — w przeciwnym razie wpisy nie mają wartości dla _claimed
Lub _average_rating
.
To, co chciałbym zrobić, to uporządkować listy w następujący sposób:
- Pokaż wszystkie aukcje, które zostały zgłoszone jako pierwsze, posortowane według średniej oceny (od najwyższej do najniższej)
- Pokaż wszystkie ogłoszenia, które nie zostały odebrane po tym, posortowane według średniej oceny (od najwyższej do najniższej)
Dostarczono mi następujący kod MySQL i wydaje się, że działa to podczas testowania w phpMyAdmin:
SELECT p.`ID` , IFNULL( pm.`meta_value` , 0 ) AS claimed, IFNULL( pm2.`meta_value` , 0 ) AS averageRating
FROM wp_posts p
LEFT JOIN wp_postmeta pm ON p.ID = pm.`post_id`
AND pm.`meta_key` = '_claimed'
LEFT JOIN wp_postmeta pm2 ON p.ID = pm2.`post_id`
AND pm2.`meta_key` = '_average_rating'
ORDER BY claimed DESC , averageRating DESC
Wtyczka, której używam, wymaga utworzenia filtra w pliku WP_Query
– wtyczka, jeśli jesteś zainteresowany, nazywa się FacetWP, a poniżej znajduje się przykładowy kod filtrów, które mam w tej chwili, aby dać ci wyobrażenie o tym, co jest wymagane:
—
function my_facetwp_sort_options( $options, $params ) {
$options['rating'] = array(
'label' => 'Ripoff',
'query_args' => array(
'meta_query' => array(
array(
'key' => '_average_rating',
'value' => 2,
'compare' => '<=',
'type' => 'NUMERIC',
)
),
'orderby' => 'meta_value_num', // sort by numerical custom field
'meta_key' => '_average_rating', // required when sorting by custom fields
'order' => 'DESC' // descending order
)
);
$options['review_desc'] = array(
'label' => 'Average Review (highest)',
'sort_custom' => true,
'query_args' =>
array(
'meta_query' => array(
'relation' => 'OR',
array(
'key' => '_claimed',
'value' => 1,
'compare' => '=',
'type' => 'NUMERIC'
),
array(
'key' => '_average_rating'
)
)
)
);
$options['recent_review'] = array(
'label' => 'Most Recent Reviews',
'query_args' => array(
'orderby' => 'meta_value_num',
'meta_key' => 'date_reviewed',
'order' => 'DESC',
)
);
return $options;
}
add_filter( 'facetwp_sort_options', 'my_facetwp_sort_options', 10, 2 );
—
Dokumentacja wtyczki tutaj, jeśli jesteś zainteresowany:
Aby wygenerować wymagane zapytanie MySQL – które, jak wiem, działa, dodałem następujący kod:
function mysite_custom_sort( $orderby, $wp_query ) {
if ( isset( $wp_query->query_vars['sort_custom'] ) ) {
$orderby = 'mt1.meta_value ASC, mt2.meta_value DESC';
}
return $orderby;
}
function edit_posts_join_paged($join_paged_statement) {
if ( isset( $wp_query->query_vars['sort_custom'] ) ) {
$join_paged_statement = "LEFT JOIN wp_postmeta pm ON p.ID = pm.`post_id`
AND pm.`meta_key` = '_claimed'
LEFT JOIN wp_postmeta pm2 ON p.ID = pm2.`post_id`
AND pm2.`meta_key` = '_average_rating'";
}
return $join_paged_statement;
}
add_filter( 'posts_orderby', 'mysite_custom_sort', 10, 2 );
add_filter('posts_join_paged','edit_posts_join_paged');
Rozumiem, że dodaje to zwyczaj orderby
i również JOIN
instrukcje do WP_Query. Jednak nie wiem, jak odtworzyć następujący kod w WP_Query:
SELECT p.`ID` , IFNULL( pm.`meta_value` , 0 ) AS claimed, IFNULL( pm2.`meta_value` , 0 ) AS averageRating
Zauważ, że w powyższym przykładzie ustawia wszystkie wartości dla _claimed i _average_rating na 0 – tak, że wszystko jest wyświetlane. Jak mogę to zrobić z WP_Query
chociaż w ramach działania wtyczki zgodnie z wymaganiami, które wymieniłem powyżej, którymi są:
- Pokaż wszystkie aukcje, które zostały zgłoszone jako pierwsze, posortowane według średniej oceny (od najwyższej do najniższej)
- Pokaż wszystkie ogłoszenia, które nie zostały odebrane po tym, posortowane według średniej oceny (od najwyższej do najniższej)
Wszelkie uwagi na ten temat byłyby bardzo mile widziane.