我想在woocommerce产品中添加原产国

时间:2018-08-25 15:39:16

标签: wordpress woocommerce hook-woocommerce

嗨,我想在添加产品时添加原产国,然后根据原产国对产品进行排序 我能做到吗?

1 个答案:

答案 0 :(得分:0)

将这些功能添加到主题的“ functions.php”中。

  

在“管理员”中显示并保存自定义字段

// display field in admin
add_action('woocommerce_product_options_general_product_data', 'woocommerce_product_country_field');
function woocommerce_product_country_field()
{
    global $woocommerce, $post;

    $countries_obj   = new WC_Countries();
    $options   = $countries_obj->__get('countries');

    echo '<div class="product_country_field">';
    woocommerce_wp_select(
        array(
            'id' => '_country_origin',
            'label' => __('Country of origin', 'woocommerce'),
            'options' => $options,
            'desc_tip' => 'true'
        )
    );
    echo '</div>';
}

// save fields
add_action('woocommerce_process_product_meta', 'woocommerce_product_country_fields_save');
function woocommerce_product_country_fields_save($post_id)
{  
    $woocommerce_country_origin = $_POST['_country_origin'];
    if (!empty($woocommerce_country_origin))
        update_post_meta($post_id, '_country_origin', esc_attr($woocommerce_country_origin));

}
  

在前端按自定义字段排序

// sort field
function custom_add_country_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 '_country_origin':
            $sort_args['orderby']  = 'meta_value';
            $sort_args['order']    = 'asc';
            $sort_args['meta_key'] = '_country_origin';
            break;      
        case '_country_origin-desc':
            $sort_args['orderby']  = 'meta_value';
            $sort_args['order']    = 'desc';
            $sort_args['meta_key'] = '_country_origin';
            break;  
    }

    return $sort_args;
}
add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_add_country_ordering_args' );

//change sort dropdown
function custom_add_country_orderby( $sortby ) {
    //remove default sorting
    unset($sortby["popularity"]);
    unset($sortby["rating"]);
    unset($sortby["date"]);
    unset($sortby["price"]);
    unset($sortby["price-desc"]); 

    $sortby['_country_origin'] = __( 'Sort by Country of origin', 'woocommerce' );  
    $sortby['_country_origin-desc'] = __( 'Sort by Country of origin descending', 'woocommerce' ); 

    return $sortby;
}
add_filter( 'woocommerce_default_catalog_orderby_options', 'custom_add_country_orderby' );
add_filter( 'woocommerce_catalog_orderby', 'custom_add_country_orderby' );

请注意,带有“原产国”的产品只会在分类时显示。

  

按前端中的自定义字段过滤

如果要过滤而不是排序,请添加此内容。

//add custom filter
add_action( 'woocommerce_before_shop_loop', 'filter_loop_start' );
function filter_loop_start( $query ){
    $countries_obj   = new WC_Countries();
    $options   = $countries_obj->__get('countries');
    ?>
    <form name="product_filter_form" class="woocommerce-filtering" method="get">
        <select name="country_origin" class="filterby" onChange="document.product_filter_form.submit();">
        <option value="">Filter by Country of origin</option>
        <?php foreach ($options as $key => $value) { ?>
        <option value="<?php echo $key; ?>"<?php if($_GET['country_origin']==$key) echo ' selected'; ?>><?php echo $value; ?></option>
        <?php } ?>
        </select>
        <input name="paged" value="1" type="hidden">
    </form>
<?php
}

//modify query for filter
add_filter( 'pre_get_posts', 'my_modify_main_query' );
function my_modify_main_query( $query ) {
    if( ! isset( $_GET['country_origin'] ) ) return $query;

    $meta_query_args = array(
        'meta_query' => array(
            array(
                'key' => '_country_origin',
                'value' => sanitize_text_field( $_GET['country_origin'] ),
                'compare' => 'LIKE',
            )
        )
    );
    $query->set('meta_query', $meta_query_args);

    return $query;
}