TODO: To change the header's content go to Dr.Explain menu Options : Project Settings : HTML (CHM) Export : Setup HTML Template and Layout
×
Menu
Index

Sửa đổi câu lệnh SQL

- Sửa đổi câu lệnh where sql: posts_where:
add_filter( 'posts_where' , 'posts_where' );
 
function posts_where( $where ) {
 
    if( is_admin() ) {
        global $wpdb;
       
        if ( isset( $_GET['author_restrict_posts'] ) && !empty( $_GET['author_restrict_posts'] ) && intval( $_GET['author_restrict_posts'] ) != 0 ) {
            $author = intval( $_GET['author_restrict_posts'] );
       
            $where .= " AND ID IN (SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id=$author )";
        }
    }
    return $where;
}
 
Cài đặt post_where chỉ định sử dụng vào một vài WP_Query trong template.
$q=new WP_Query(array(
          'abc'=>'1',   #mark this query by extra own key
          'post_type'=>'tcp_product',
          'meta_query'          => array(
                 'relation' => 'AND',
                 array(
                       'key' => 'old_price',
                       'value' => '0',
                       'compare' => '>'
                 )
          )
        
     ));
     while($q->have_posts()){
          $q->the_post();
        
     }
remove_filter( 'posts_where', 'wpse18703_posts_where', 10 );  #recommend: you can remove this filter after do querywpse18703_posts_where
 
#post_where
add_filter( 'posts_where', 'wpse18703_posts_where', 10, 2 );
function wpse18703_posts_where( $where, &$wp_query )
{
     if(isset($wp_query->query['abc'])){  //check own key exists
          global $wpdb;
          if ( $wpse18703_title = $wp_query->get( 'wpse18703_title' ) ) {
               $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'' . esc_sql( $wpdb->esc_like( $wpse18703_title ) ) . '%\'';
              $where .= " AND (($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value >= '2000-01-01') AND ($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value <= '2004-12-31')) ";
          }
     }
   return $where;
}
 
- Sửa các mệnh đề (vd: order, orderby) trong chuỗi lệnh SQL tạo bởi wordpress.
Bài tập: Lọc dữ liệu bởi meta key và xắp xếp theo một meta key khác.
function wpse163696_posts_clauses( $pieces, $query ) {
    if ( $query->get( 'orderby' ) != 'dealer_date' ) {
        return $pieces;
    }
    global $wpdb;
 
    $order = $query->get( 'order' );
    $pieces[ 'join' ] .= $wpdb->prepare(
        ' LEFT JOIN ' . $wpdb->postmeta . ' dealer_pm ON dealer_pm.post_id = ' . $wpdb->posts . '.ID AND dealer_pm.meta_key = %s'
        , '_dealer_number' );
    $pieces[ 'orderby' ] = 'ISNULL(MAX(dealer_pm.meta_value)) ' . $order . ', MAX(dealer_pm.meta_value) ' . $order  . ', ' . $wpdb->posts . '.post_date ' . $order;
    return $pieces;
}
add_filter( 'posts_clauses', 'wpse163696_posts_clauses', 10, 2 );
 
$customer_orders = get_posts( array(
    'numberposts' => $order_count,
    'meta_query' => array(
        array(
            'key'     => '_customer_user',
            'value'   => get_current_user_id(),
            'compare' => '=',
        ),
    ),
    'orderby'    => 'dealer_date',
    'order'      => 'ASC',
    'suppress_filters' => false,
) );
remove_filter( 'posts_clauses', 'wpse163696_posts_clauses', 10 );  #remove after apply filter
 
Sử dụng wildcard:
// custom filter to replace '=' with 'LIKE'
function my_posts_where( $where )
{
     $where = str_replace("meta_key = 'images_%_type'", "meta_key LIKE 'images_%_type'", $where);
 
     return $where;
}
 
add_filter('posts_where', 'my_posts_where');
 
------------------------------------------------------------------------------
// args
$args = array(
     'numberposts' => -1,
     'post_type' => 'event',
     'meta_query' => array(
          array(
               'key' => 'images_%_type',
               'value' => 'type_1',
          )
     )
);
 
// get results
$the_query = new WP_Query( $args );
 
So sánh 2 meta fields.
- Nâng cao:
Bằng cách lấy tên trường thông qua alias trong lệnh SQL sinh ra bởi wordpress, ở đây wordpress cho chúng ta ký tự mt{n} trong đó (n là số nguyên bắt đầu từ 1) . Ví dụ Thiết lập trường balance bởi giá trị 'mt1.meta_value' sau đó sử dụng filter 'posts_request' để xóa ký tự nháy bao chuỗi.
$args = array(
  'post_type' => 'post', // maybe not
  'meta_query' => array(
    array(
      'key' => 'balance',
      'compare' => '>=',
      'value' => 'mt1.meta_value', // this will be treated as a string
      'type' => 'NUMERIC'
    ),
    // this is to force adding the needed JOIN clause
    array(
      'key' => 'monthly_price',
      'compare' => 'EXISTS'
    ),
    'relation' => 'AND'
  )
);
 
$closure = function( $sql ) {
  // remove single quotes around 'mt1.meta_value'
  return str_replace( "'mt1.meta_value'", "mt1.meta_value", $sql );
};
 
add_filter( 'posts_request', $closure );
 
$query = new \WP_Query( $args ); // this is your query :)
 
remove_filter( 'posts_request', spl_object_hash( $closure ) );
 
- Cách truyền thống: cách đơn giản hơn để so sánh 2 meta fields là chúng ta so sánh sau khi đã lấy kết quả posts, trước khi hiển thị trên web bạn lấy 2 giá trị cần so sánh để lọc kết quả cuối cùng.
<?php
 
// The Query
 
$my_query = new WP_Query(array(
        'post_status' => 'publish',
        'post_type' => 'post',
        'posts_per_page' => '10',
        'offset' => '1',
        'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1
    ));
 
// The Loop
if ( $my_query->have_posts() ) {
     while ( $my_query->have_posts() ) {
          $my_query->the_post();
          $old_price =  get_post_meta(get_the_ID(), 'old_price', true);
             $price    =  get_post_meta(get_the_ID(), 'price', true);
               if( $price < $old_price ) {
          the_title();
          echo '<br>';
              }
     }
} else {
     // no posts found
}
 
/* Restore original Post Data */
wp_reset_postdata();
?>
 
- Sử dụng toàn bộ tùy biến SQL:
$sql = "select wp_posts.ID FROM wp_posts where (SELECT CAST(meta_value as DECIMAL(10,5)) FROM `wp_postmeta` WHERE `meta_key` = 'price' and post_id=wp_posts.ID) <> (SELECT CAST(meta_value as DECIMAL(10,5))  FROM `wp_postmeta` WHERE `meta_key` = 'old_price' and post_id=wp_posts.ID) and wp_posts.post_status = 'publish'";
 
$pageposts = $wpdb->get_results($sql, OBJECT);
 
 
Made with help of Dr.Explain

Unregistered version