Я хотел бы добавить страну происхождения к продуктам в WooCommerce - PullRequest
0 голосов
/ 25 августа 2018

Привет. Я хотел бы добавить страну происхождения при добавлении товаров, а затем отсортировать товары по стране происхождения. Могу ли я добиться этого?

1 Ответ

0 голосов
/ 26 августа 2018

Добавьте эти функции в файл functions.php вашей темы.

Отображение и сохранение настраиваемого поля в Admin

// 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));

}

Сортировать по пользовательскому полю в Front-End

// 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...