Wordpress WP_Query仅比较meta_query键的Month部分

时间:2014-03-26 15:53:32

标签: php sql wordpress-plugin wordpress

我一直在尝试使用wordpress wp_query方法,但我的情况是具体的。

我需要选择当月的所有产品,所以这是我的代码

$args = array(
    'numberposts' => -1,
    'post_type' => 'product',

    'meta_query' => array(
            'Relation' => 'AND',
    array(
            'key'     => 'wpcf-product_status',
            'value'   => 'valid',
            'compare' => '='
        ),
    array(
            'key'     => 'wpcf-product-start_date',
            'compare' => '=',

            'date_query' => array(
                array(
                        'month'      => date('m'),
                        'compare'   => '=',
                ),              
        ),
    ),
    ),
);
// get results
$the_query = new WP_Query( $args );

我无法得到确切的结果。 怎么可能只测试日期MONTH就像SQL(WHERE MONTH(wpcf-product-start_date) = MONTH(NOW())

那样

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

试试这个。并确保' wpcf-product-start_date'具有相同格式的日期(' m')' :)

$m = date('m');
$args = array(
    'numberposts' => -1,
    'post_type' => 'product',

    'meta_query' => array(
            'Relation' => 'AND',
    array(
            'key'     => 'wpcf-product_status',
            'value'   => 'valid',
            'compare' => '='
        ),
    array(
            'key'     => 'wpcf-product-start_date',
            'compare' => '=',
            'value'   => '$m'    
        ),
    ),
    ),
);

答案 1 :(得分:1)

以下是一些其他选项:

  1. 如果您要在给定的中过滤给定的,您只需计算该月的时间戳期间并使用元查询的相应比较运算符来过滤它。

  2. 您可能需要考虑将wpcf-product-start_date自定义字段值的格式更改为Y-m-dY-mm,具体取决于您的需求。< / p>

  3. 您可以使用{added,updated,deleted}_post_meta挂钩(例如,参见此fine answer)自动保存新的自定义字段,其中包含根据wpcf-product-start_date时间戳计算的月份数。例如:

    add_action( 'added_post_meta',   'b2e_update_post_meta', 10, 4 );
    add_action( 'updated_post_meta', 'b2e_update_post_meta', 10, 4 );
    
    function b2e_update_post_meta( $meta_id, $post_id, $meta_key, $meta_value )
    {
        if ( 'wpcf-product-start-date' === $meta_key )
        {
            // avoid infinite loop
           remove_action( current_filter(), __FUNCTION__ );            
    
           // add/update the corresponding month value
           update_post_meta( $post_id, 
                             'wpcf-product-start-month', 
                             date( 'n', $meta_value ) 
           );
        }
    }
    
    add_action( 'deleted_post_meta', 'b2e_delete_post_meta', 10, 4 );
    
    function b2e_delete_post_meta( $deleted_meta_ids, $post_id, $meta_key,
                                   $only_delete_these_meta_values )
    {
        if ( 'wpcf-product-start-date' === $meta_key )
        {
            // avoid infinite loop
            remove_action( current_filter(), __FUNCTION__ );            
    
           // delete the corresponding month key        
            delete_post_meta( $post_id, 'wpcf-product-start-month' );
        }
    }
    

    然后,您可以在元查询中使用wpcf-product-start-month

    请注意,我在这里使用了wpcf-product-start-date。不知何故,这没有触发带有元键wpcf-product-start_date的自定义字段。但如果您对此有疑问,请告诉我。

  4. 如果您冒险,您可以使用posts_where过滤器:

    $args = array(
        'posts_per_page' => -1,
        'post_type'      => 'product',
        'meta_query'     => array(
            'relation'    => 'AND',
            array(
                'key'     => 'wpcf-product_status',
                'value'   => 'valid',
                'compare' => '='
            ),
            array(
                'key'     => 'wpcf-product-start_date',
                'compare' => '=',
                'value'   => 'replace_me',
            ),
        ),
    );
    
    add_filter( 'posts_where', 'b2e_posts_where' );
    $the_query = new WP_Query( $args );
    remove_filter( 'posts_where', 'b2e_posts_where' );
    

    ,其中

    function b2e_posts_where( $where )
    {
        $month = 3; // Edit this value
    
        if( FALSE !== stripos( $where, 'replace_me' ) )
        {
            $from  = "CAST(mt1.meta_value AS CHAR) = 'replace_me'";
            $to    = "MONTH( FROM_UNIXTIME( 1 * mt1.meta_value ) ) = $month 
                      AND YEAR( FROM_UNIXTIME( 1 * mt1.meta_value ) ) > 1970 ";
            $where = str_ireplace( $from, $to, $where );
        }
        return $where;
    }
    

    请注意,这假定replace_me值位于 second 元查询数组项中。
    如果重新排序数组项(例如wp_postmeta, mt1, ...),表名称可能会更改。有可能找到 自动更正表名,但这超出了这个答案的范围。

  5. 希望得到这个帮助。

答案 2 :(得分:0)

... OR

您可以将月份开始和月末作为时间戳并使用“BETWEEN”元比较:

例如

$year = date('Y'); $month = date('m')
$days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $year);
$month_start = strtotime($year .  '-' . $month . '-1 00:00:00');
$month_end = strtotime($year .  '-' . $month . '-' . $days_in_month . ' 23:59:59');

$args = array(
    'numberposts' => -1,
    'post_type' => 'product',
    'meta_query' => array(
        'key' => 'wpcf-product-start_date',
        'value' => array(
             $month_start,
             $month_end
        ),
        'compare' => 'BETWEEN'
    )
);

...或

$args = array(
    'numberposts' => -1,
    'post_type' => 'product',
    'meta_query' => array (
        'relation' => 'AND',
        array(
            'key' => 'wpcf-product-start_date',
            'value' => $month_start,
            'compare' => '>='
        ),
        array(
            'key' => 'wpcf-product-start_date',
            'value' => $month_end,
            'compare' => '<='
        )
    )
)