Comment chercher des produits avec les champs personnalisés (back-office) sous WooCommerce ?

Dans WooCommerce, il y a deux types de recherche : celle du client (front-office) et celle de l’administrateur (back-office). Nous avons déjà vu comment permettre aux clients d’effectuer des recherches dans les valeurs des champs personnalisés en plus du titre et de la description du produit par défaut, nous allons donc parler cette fois-ci de la recherche dans le tableau de bord WordPress.

Supposons qu’en tant qu’administrateur d’une boutique WooCommerce, vous ayez ajouté un champ personnalisé de produit (par exemple « gtin »), et que vous souhaitiez vous assurer que la recherche en dans le back-office renvoie également les produits pour lesquels « gtin » est égal au terme de recherche. L’extrait de code que nous allons vous présenter aujourd’hui vous aidera à le faire.

J’aimerais rechercher des produits par « ABC » comme dans la capture d’écran ci-dessus, où « ABC » pourrait également être présent dans certains champs personnalisés. Le snippet ci-dessous corrige ce problème.
add_filter( 'posts_where', 'wootimeo_search_products_by_custom_field_in_admin', 9999, 2 );
 
function wootimeo_search_products_by_custom_field_in_admin( $where, $wp_query ) {   
    global $wpdb, $pagenow;
    $post_type = 'product';
    $custom_fields = array(
        "gtin",
        "ean",
    );
    if ( is_admin() && 'edit.php' === $pagenow && $wp_query->query['post_type'] === $post_type && isset( $_GET['s'] ) ) {
      $get_post_ids = array();
      foreach ( $custom_fields as $custom_field_name ) {
         $args = array(
            'posts_per_page' => -1,
            'post_type' => $post_type,
            'meta_query' => array(
               array(
                  'key' => $custom_field_name,
                  'value' => wc_clean( wp_unslash( $_GET['s'] ) ),
                  'compare' => 'LIKE'
               )
            ),
            'fields' => 'ids',
         );
         $posts = get_posts( $args );
         if ( ! empty( $posts ) ) {
            foreach ( $posts as $post_id ) {
               $get_post_ids[] = $post_id;
            }
         }
      }
      $search_ids = array_filter( array_unique( array_map( 'absint', $get_post_ids ) ) );
      if ( count( $search_ids ) > 0 ) {
         $where = str_replace( "wp_posts.ID IN (0)", "wp_posts.ID IN (" . implode( ',', $search_ids ) . ")", $where );
      }      
   }   
    return $where;   
}Langage du code : PHP (php)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *