web-dev-qa-db-fra.com

WooCommerce - filtrer par produits en vedette dans admin

WooCommerce propose un moyen simple de sélectionner les produits "en vedette" en cliquant sur une petite icône étoile dans la colonne "En vedette" de la zone d'administration.

Je dois pouvoir filtrer et afficher uniquement les produits en vedette dans la zone d'administration. Est-ce que quelqu'un connaît un moyen simple de faire cela?

J'ai creusé un peu et il s'est avéré que cela se fait avec des méta clé/valeurs, où _featured est la clé et la valeur est yes ou no.

Malheureusement, comme ce n'est pas le cas avec les taxonomies telles que les catégories de produits, il n'y a aucun moyen d'utiliser la fonctionnalité de filtrage dans la zone d'administration pour afficher uniquement les produits en vedette. Vous pouvez trier la colonne sélectionnée de sorte qu'elles figurent toutes en haut ou en bas de la liste de produits, mais c'est tout.

1
Gabriel Luethje

J'ai trouvé ce plugin: https://wordpress.stackexchange.com/a/45447/15190 , que j'ai pu personnaliser pour fournir une liste de sélection filtrée par produit en vedette. Grâce à cela, je peux ensuite utiliser la fonction de glisser-déposer de Trier les produits de WooCommerce pour modifier facilement l'ordre d'affichage des produits en vedette dans le widget Produits en vedette et autres lieux.

Voici le code de mes personnalisations qui le fera fonctionner pour les produits en vedette 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

Vous pouvez trier votre liste de produits par statut. Il suffit de cliquer sur l'étoile en haut de la colonne ... une fois, tous les éléments non décrits seront placés en haut de la liste.

Votre URL d'administrateur ressemblera à: /wp-admin/edit.php?post_type=product&orderby=featured&order=desc

Sort products by featured status

MODIFIER:

Ok, il n’est donc pas difficile de filtrer par statut. WooCommerce filtre par "sous-type", et comme il filtre également par méta, nous pouvons généralement simplement copier leur code et faire quelques ajustements.

La première fonction ajoute l'élément select/drop-down, tandis que la seconde gère les réglages de la requête 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' );

Mise à jour pour WooCommerce 3.0

Le rappel parse_query doit être mis à jour car le statut présenté n'est plus stocké en tant que méta post.

/**
 * 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