WordPress

wtyczki – klucze meta WP_Query i NULL

  • 9 marca, 2017
  • 4 min read
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:

Warto przeczytać!  shortcode — Jak wyświetlić listę stron podrzędnych z fragmentami, np [child-pages depth="1" excerpt="1"]

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)
Warto przeczytać!  tworzenie wtyczek — Jak używać funkcji setAttributes poza powrotem funkcji edycji

Wszelkie uwagi na ten temat byłyby bardzo mile widziane.


Źródło