按自定义日期字段

时间:2017-06-27 14:22:31

标签: php wordpress woocommerce

我想显示即将举行的音乐会列表。 每场音乐会都有两个属性:日期和地点。

我试图通过显示所有变化来展示下一场音乐会。 这就是我到目前为止所做的:

<?php
    global $woocommerce, $product, $post, $re_wcvt_options;
    $available_variations = $product->get_available_variations();
    $attributes = $product->get_attributes();
?>
<ul>
    <?php foreach ($available_variations as $prod_variation) : ?>
        <?php
            // get some vars to work with
            $post_id = $prod_variation['variation_id'];
            $post_object = get_post($post_id);
        ?>
        <li>
        <?php foreach ($prod_variation['attributes'] as $attr_name => $attr_value) : ?>
            <?php
                // Get the correct variation values
                if (strpos($attr_name, '_pa_')){ // variation is a pre-definted attribute
                    $attr_name = substr($attr_name, 10);
                    $attr = get_term_by('slug', $attr_value, $attr_name);
                    $attr_value = $attr->name;
                } else { // variation is a custom attribute
                }
                echo $attr_value;
            ?>
        <?php endforeach;?>
        </li>
    <?php endforeach;?>
</ul>

使用此解决方案的问题在于它仅适用于产品,仅适用于一种产品。我无法显示具有不同位置和日期(变体)的多个音乐会(产品)列表。

所以我尝试使用循环显示产品/音乐会,并按照自定义字段排序。

我过去曾为一个简单的自定义帖子类型做过。 这就是解决方案:

<?php
$today_query = date ('Ymd');
$args = array(
    'post_type'              => array( 'concert' ),
    'posts_per_page'         => '10',
    'meta_key' => 'date',
    'meta_compare' => '>=',
    'meta_value' => $today_query,
    'orderby' => 'meta_value',
    'order' => 'ASC',
);
$query = new WP_Query( $args ); ?>

代码按元字段对帖子进行排序,并在将来仅显示音乐会。 我唯一不理解的是如何使用单个变体中的元字段?!

有人有解决方案吗?

1 个答案:

答案 0 :(得分:1)

尝试使用pre_get_posts hook

add_action( 'pre_get_posts', 'sort_products' );

function sort_products( $query )
{
    // If inside dashboard, skip sorting
    if (is_admin()){
        return;
    }
    // Check of query have woocommerce post type
   if (is_post_type_archive('product')){
        $query->set('meta_key', 'date');
        $query->set('meta_compare' , '>=');
        $query->set('meta_value' , time());
        $query->set('orderby', 'meta_value');
    }
    return $query;
}