web-dev-qa-db-ja.com

WooCommerce - adminのおすすめ商品で絞り込む

WooCommerceでは、管理者エリアの「おすすめ」列にある小さな星型のアイコンをクリックして、「おすすめ」商品を簡単に選択できます。

私は管理領域で注目の商品だけをフィルタリングして表示できるようにする必要があります。誰もがこれを行うための簡単な方法を知っていますか?

私は少し掘り下げましたが、これはメタキー/値で行われています。ここで_featuredはキーで、値はyesまたはnoです。

残念ながら、商品カテゴリのような分類法では行われていないため、管理領域のフィルタ機能を使用して、注目商品のみを表示することはできません。おすすめの列を並べ替えることで、それらがすべて商品リストの一番上または一番下に表示されるようにすることができますが、それだけです。

1
Gabriel Luethje

私はこのプラグインを見つけました: https://wordpress.stackexchange.com/a/45447/15190 、これは私が注目の製品でフィルタするための選択リストを提供するようにカスタマイズすることができました。それにより、WooCommerceのSort Productsドラッグアンドドロップ機能を使用して、Featured Productsウィジェットや他の場所に表示されるおすすめ商品の順序を簡単に変更できます。

これがWooCommerceのおすすめ商品に使えるようにカスタマイズしたコードです。

<?php
/*
Plugin Name: Admin Filter By WooCommerce Featured Products
Plugin URI: http://en.bainternet.info
Description: adapted from https://wordpress.stackexchange.com/q/45436/2487. Allows you to show only Featured products, which will then allow for drag and drop sorting of Featured products
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/

add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );
/**
 * First create the dropdown
 * 
 * @author Ohad Raz
 * 
 * @return void
 */
function wpse45436_admin_posts_filter_restrict_manage_posts(){
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }

    //only add filter to post type you want
    if ('product' == $type){
        //change this to the list of values you want to show
        //in 'label' => 'value' format
        $values = array(
            'Show Only Featured' => 'Yes', 
            'Show Only Non-Featured' => 'No',
        );
        ?>
        <select name="Featured">
        <option value=""><?php _e('Show Featured & Non-Featured', 'wpse45436'); ?></option>
        <?php
            $current_v = isset($_GET['Featured'])? $_GET['Featured']:'';
            foreach ($values as $label => $value) {
                printf
                    (
                        '<option value="%s"%s>%s</option>',
                        $value,
                        $value == $current_v? ' selected="selected"':'',
                        $label
                    );
                }
        ?>
        </select>
        <?php
    }
}

add_filter( 'parse_query', 'wpse45436_posts_filter' );
/**
 * if submitted filter by post meta
 * 
 * @author Ohad Raz
 * @param  (wp_query object) $query
 * 
 * @return Void
 */
function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'product' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['Featured']) && $_GET['Featured'] != '') {
        $query->query_vars['meta_key'] = '_featured';
        $query->query_vars['meta_value'] = $_GET['Featured'];
    }
}
2
Gabriel Luethje

あなたは注目のステータスであなたの商品リストをソートすることができます。列の一番上にある星をクリックするだけで…。一度だけすべての特徴のない項目を一番上に置き、二度これを逆にしてすべての特徴のある項目を一番上に置くべきです。

あなたの管理URLは次のようになります。/wp-admin/edit.php?post_type=product&orderby=featured&order=desc

Sort products by featured status

編集:

わかりました、それでそれは特色にされたステータスによってフィルターにかけることがそれほど難しいことではないことが判明しました。 WooCommerceは「サブタイプ」でフィルタリングしていますが、それはメタでもフィルタリングされているため、ほとんどの場合はコードをコピーしていくつか調整を加えることができます。

最初の関数はselect /ドロップダウン要素を追加し、2番目の関数はadminクエリに対する調整を処理します。

/**
 * Filter products by type
 *
 * @access public
 * @return void
 */
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');

/**
 * Filter the products in admin based on options
 *
 * @access public
 * @param mixed $query
 * @return void
 */
function wpa104537_featured_products_admin_filter_query( $query ) {
    global $typenow, $wp_query;

    if ( $typenow == 'product' ) {

        // Subtypes
        if ( ! empty( $_GET['featured_status'] ) ) {
            if ( $_GET['featured_status'] == 'featured' ) {
                $query->query_vars['meta_value']    = 'yes';
                $query->query_vars['meta_key']      = '_featured';
            } elseif ( $_GET['featured_status'] == 'normal' ) {
                $query->query_vars['meta_value']    = 'no';
                $query->query_vars['meta_key']      = '_featured';
            }
        }

    }

}

add_filter( 'parse_query', 'wpa104537_featured_products_admin_filter_query' );

WooCommerce 3.0用に更新

注目のステータスがポストメタとして保存されなくなったため、parse_queryコールバックを更新する必要があります。

/**
 * Filter the products in admin based on options
 *
 * @access public
 * @param mixed $query
 * @return void
 */
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' );
8
helgatheviking