В данной статье собираются сниппеты меняющие функционал или внешний вид админ части Woocommerce.
Вернуть выпадающий список категорий
С версии WC 3.2 изменился фильтр постов в админке, конкретно выбор категории. Теперь сделали в виде Ajax строки поиска. Это не всегда удобно. Вернем предыдущую версию в виде выпадающего дерева категорий:
//Возвращаем в админку выпадающий список категорий
add_action( 'restrict_manage_posts', 'wcacd_category_dropdown', 15 );
function wcacd_category_dropdown() {
// show the old dropdown category filter from WC 3.1.2
wc_product_dropdown_categories( array( 'option_select_text' => __( 'Filter by category', 'woocommerce' ) ) );
// hide the WC 3.2+ ajax category filter
print '<style>.post-type-product .tablenav div .select2 {display:none;}</style>';
}
Переключатель уровня вложенности категорий
Решение взято с сайта wp-kama.
// Переключатель уровня категорий в админке
$taxonomy = 'product_cat';
add_action( "{$taxonomy}_add_form", function($taxonomy){
ob_start();
} );
add_action( "after-{$taxonomy}-table", function($taxonomy){
$html = ob_get_clean();
$__preg_replace_callback = function( $match ){
$val = @ $_GET['parent_only'];
ob_start();
?>
<div class="alignleft actions">
<select name="parent_only" onchange="window.add_param_to_URL(this)">
<option value="">Все уровни...</option>
<option value="yes" <?php selected('yes', $val) ?> >Только родители</option>
</select>
</div>
<script>
window.add_param_to_URL = function(el){
var href = window.location.href, sep = /[?]/.test(href) ? "&" : "?", name = el.name.replace(/[^a-z_-]/i,'');
window.location = (new RegExp(name+'=?')).test(href) ? href.replace( (new RegExp('([?&]'+name+'=?)[^&]*')), (el.value ? "$1"+ el.value : '') ) : (href + sep + name + "="+ el.value);
}
</script>
<?php
return $match[1] . ob_get_clean();
};
echo preg_replace_callback('~(id="doaction[^<]+</div>)~', $__preg_replace_callback, $html );
} );
add_filter('get_terms_args', 'my_terms_filter_handler');
function my_terms_filter_handler( $query ){
if( empty($_GET['parent_only']) || ! is_admin() ) return $query;
if( ! ( $query['fields'] == 'count' || isset($query['page']) ) )
return $query;
$query['parent'] = 0; // только родители
return $query;
}
Сортировка по колонке Статус наличия
// Сортировка товаров по статусу наличия
add_filter( 'manage_edit-product_sortable_columns', 'my_product_sorting_column' );
function my_product_sorting_column( $columns ) {
$columns['is_in_stock'] = 'in_stock';
return $columns;
}
add_action( 'pre_get_posts', 'my_product_sorting' );
function my_product_sorting( $query ) {
if( ! is_admin() )
return;
$orderby = $query->get( 'orderby');
if( 'in_stock' == $orderby ) {
$query->set('meta_key','_stock_status');
$query->set('orderby','meta_value');
}
}
Сортировка в админке по умолчанию
Можно произвольно изменить порядок вывода товаров в админке. При этом выбор сортировки по умолчанию не влияет на вывод товаров в админке.
Сортировка по названию
function sp_41964737_custom_product_order( $query ){
global $typenow;
if( is_admin() && $query->is_main_query() && $typenow == 'product' ){
/* Post Column: e.g. title */
if($query->get('orderby') == ''){
$query->set('orderby', 'title');
}
/* Post Order: ASC / DESC */
if($query->get('order') == ''){
$query->set('order', 'ASC');
}
}
}
add_action( 'parse_query', 'sp_41964737_custom_product_order' );
Сортировка по статусу наличия (сначала в наличии)
function sp_41964737_custom_product_order( $query ){
global $typenow;
if( is_admin() && $query->is_main_query() && $typenow == 'product' ){
/* Post Column: e.g. title */
if($query->get('meta_key') == ''){
$query->set('meta_key', '_stock_status');
}
/* Post Column: e.g. title */
if($query->get('orderby') == ''){
$query->set('orderby', 'meta_value');
}
/* Post Order: ASC / DESC */
if($query->get('order') == ''){
$query->set('order', 'ASC');
}
}
}
add_action( 'parse_query', 'sp_41964737_custom_product_order' );
Добавить фильтр по рекомендуемым (featured) товарам
function wpa104537_filter_products_by_featured_status() {
global $typenow, $wp_query;
if ($typenow=='product') :
// Featured/ Not Featured
$output .= "<select name='featured_status' id='dropdown_featured_status'>";
$output .= '<option value="">'.__( 'Show All Featured Statuses', 'woocommerce' ).'</option>';
$output .="<option value='featured' ";
if ( isset( $_GET['featured_status'] ) ) $output .= selected('featured', $_GET['featured_status'], false);
$output .=">".__( 'Featured', 'woocommerce' )."</option>";
$output .="<option value='normal' ";
if ( isset( $_GET['featured_status'] ) ) $output .= selected('normal', $_GET['featured_status'], false);
$output .=">".__( 'Not Featured', 'woocommerce' )."</option>";
$output .="</select>";
echo $output;
endif;
}
add_action('restrict_manage_posts', 'wpa104537_filter_products_by_featured_status');
function wpa104537_featured_products_admin_filter_query( $query ) {
global $typenow;
if ( $typenow == 'product' ) {
// Subtypes
if ( ! empty( $_GET['featured_status'] ) ) {
if ( $_GET['featured_status'] == 'featured' ) {
$query->query_vars['tax_query'][] = array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => 'featured',
);
} elseif ( $_GET['featured_status'] == 'normal' ) {
$query->query_vars['tax_query'][] = array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => 'featured',
'operator' => 'NOT IN',
);
}
}
}
}
add_filter( 'parse_query', 'wpa104537_featured_products_admin_filter_query' );
[site-socialshare]
Здравствуйте.
Подскажите как сделать в админке вукомерца поиск по артикулу.
Попробуйте, как вариант, плагин Search by SKU for Woocommerce. Он расширяет поиск товаров по артикулу. Не могу только точно сказать работает ли в админке.
У меня предложенная функция сортировки в админке по умолчанию не сработала.