如何按 ACF 值对 WooCommerce 产品进行排序?

时间:2021-05-04 08:10:51

标签: wordpress woocommerce advanced-custom-fields

如何按 WooCommerce 值对 Advanced Custom Field 产品进行排序?

我在网站的后端和前端添加了一些自定义字段。我的 functions.php 中的前端实现如下所示:

add_action( 'woocommerce_before_add_to_cart_form', 'tmy_eventbooking', 20 );

function tmy_eventbooking() {
    if( !empty( get_field('datum') ) ) { // if your custom field is not empty…
        echo '<p class="acf-info">Findet statt am: <span>' . get_field('datum') . '</span></p>';
    }
        if( !empty( get_field('datum_ende') ) ) { // if your custom field is not empty…
        echo '<p class="acf-info">Bis: <span>' . get_field('datum_ende') . '</span></p>';
    }
        if( !empty( get_field('veranstaltungsort') ) ) { // if your custom field is not empty…
        echo '<p class="acf-info">Ort: <span>' . get_field('veranstaltungsort') . '</span></p>';
    }
    return;
}

这很好用。

现在我希望能够通过这些 ACF 字段(类型 datetext)对产品进行排序。

例如,如果用户单击“日期”按钮或从下拉菜单中选择位置,则所有事件都会相应地进行排序。事件是常规的 WooCommerce 服务产品。

解决这个问题的好方法是什么?

1 个答案:

答案 0 :(得分:1)

您需要使用两个过滤器钩子在基于 ACF 的存档页面中执行自定义排序。

<块引用>

使用 woocommerce_catalog_orderby 过滤器挂钩添加自定义 datelocation 选项。

// Add these date and location sorting options on the frontend.
function add_new_custom_postmeta_orderby( $sortby ) {
    $sortby['date']     = __( 'Sort by date', 'woocommerce' );
    $sortby['location'] = __( 'Sort by location', 'woocommerce' );
    return $sortby;
}
add_filter( 'woocommerce_catalog_orderby', 'add_new_custom_postmeta_orderby' );
<块引用>

使用 woocommerce_get_catalog_ordering_args 过滤器钩子修改 orderbyorder 基于您选择的选项

function add_custom_postmeta_ordering_args( $sort_args ) {
    $orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
    switch( $orderby_value ) {
        case 'date':
            $sort_args['orderby']  = 'meta_value_num';
            $sort_args['order']    = 'desc';
            $sort_args['meta_key'] = 'date';
            break;

        case 'location':
            $sort_args['orderby']  = 'meta_value';
            $sort_args['order']    = 'asc';
            $sort_args['meta_key'] = 'location';
            break;
    }
    return $sort_args;
}
add_filter( 'woocommerce_get_catalog_ordering_args', 'add_custom_postmeta_ordering_args' );

有用的链接

相关问题