使用高级自定义字段过滤和排序wordpress get_posts

时间:2016-03-14 23:56:36

标签: php wordpress advanced-custom-fields wpml

我有两个使用高级自定义字段创建的自定义字段。 一种是复选框(isEvent)的类型,另一种是日期类型(closing_date)。 如果我想获得所有事件的帖子,我会做这样的事情

<?php $args = array(
  'posts_per_page'   => 7,
  'offset'           => 0,
  'category'         => '',
  'category_name'    => '',
  'orderby'          => '',
  'order'            => '',
  'include'          => '', 
  'exclude'          => '',
  'meta_key'         => 'is_event',
  'meta_value'       => 'a:1:{i:0;s:4:"true";}',
  'post_type'        => 'events',
  'post_mime_type'   => '',
  'post_parent'      => '',
  'author'           => '',
  'post_status'      => 'publish',
  'suppress_filters' => 0 
);
$my_posts_array = get_posts( $args ); 

这是有效的。 但是,如果我想通过closing_date排序,它是类型为date的自定义字段,在ACF文档中进行排序建议我应该这样做:

<?php $args = array(
  'posts_per_page'   => 7,
  'offset'           => 0,
  'category'         => '',
  'category_name'    => '',
  'orderby'          => 'meta_value_num',
  'order'            => 'asc',
  'include'          => '', 
  'exclude'          => '',
  'meta_key'         => 'closing_date',
  'meta_value'       => '',
  'post_type'        => 'events',
  'post_mime_type'   => '',
  'post_parent'      => '',
  'author'           => '',
  'post_status'      => 'publish',
  'suppress_filters' => 0 
);
$my_posts_array = get_posts( $args );

这不起作用。更新 - 我设法让这个东西工作。经过几次测试后,我没有改变任何东西....

有人可以就这些问题(或所有问题)给出答案吗?

  1. 在wordpress中有两个自定义字段的方法是什么? 按一个排序并按另一个过滤?
  2. 这可以在一次get_posts调用中实现,还是有其他任何调用 原生wp技术?
  3. get_posts可以同时包含meta_key,meta_value和meta_query get_posts的参数列表?
  4. 我还想补充一点,我正在使用带有2种语言和fr的WPML翻译插件。

2 个答案:

答案 0 :(得分:3)

编写查询的方法是

$my_posts_array = get_posts( array(
        'post_type'         => 'events',
        'posts_per_page'    => '7',
        'offset'            => 0,
        'post_status'       => 'publish',
        'suppress_filters'  => 0,
        'meta_query'        => array(
            array(
                'key'       => 'is_event',
                'value'     => 'a:1:{i:0;s:4:"true";}',
                'compare'   => '='
            )
        ),
        'orderby'  => 'meta_value_num',
        'meta_key' => 'closing_date',
        'order'    => 'ASC',
        )
    );

2.是的,这可以在一次通话中尝试上面的代码,或者如果没有找到,那么试试这个。

$my_posts_array = get_posts( array(
    'post_type'         => 'events',
    'posts_per_page'    => '7',
    'offset'            => 0,
    'post_status'       => 'publish',
    'suppress_filters'  => 0,
    'meta_query'        => array(
        array(
            'key'       => 'is_event',
            'value'     => 'a:1:{i:0;s:4:"true";}',
            'compare'   => '='
        )
    ),
    )
);

// The Loop
foreach ($my_posts_array as $key => $value) {
    $allowed_posts[] = get_the_ID();
}


$sorted_array = get_posts( array(
    'post_type'         => 'events',
    'posts_per_page'    => '7',
    'offset'            => 0,
    'post_status'       => 'publish',
    'suppress_filters'  => 0 ,
    'post__in'          =>  $allowed_posts,
    'orderby'           => 'meta_value_num',
    'meta_key'          => 'closing_date',
    'order'             => 'ASC',
);

foreach ($sorted_array as $key => $value) {
    //do the stuff here
}

答案 1 :(得分:0)

行, 我自己设法回答了这个问题。 1.这是一种做法:

             <?php $args = array(
              'posts_per_page'   => 7,
              'offset'           => 0,
              'category'         => '',
              'category_name'    => '',
              'orderby'          => 'meta_value_num',
              'order'            => 'ASC',
              'include'          => '', 
              'exclude'          => '',
              'meta_key'         => 'closing_date',
              'meta_value'       => '',
              'post_type'        => 'events',
              'post_mime_type'   => '',
              'post_parent'      => '',
              'author'           => '',
              'post_status'      => 'publish',
              'meta_query' => array(
                            array('key' => 'is_event',
                                  'value' => 'a:1:{i:0;s:4:"true";}'
                            )
                        ),
              'suppress_filters' => 0
            );
            $my_posts_array = get_posts( $args ); 

2。我假设你可以用WP_Query以类似的方式完成这个,因为get_posts我实际上使用的是这个方法。 3.答案是肯定的,如上例所示。