web-dev-qa-db-fra.com

Définition de tous les brouillons sur "exclure du catalogue" dans WooCommerce

Est-il possible de le faire par programmation? Signification via un script PHP sur mon hôte local, exportation puis importation in - ou de toute autre manière qui fonctionnerait.

Voici ce dont je parle:

La table wp_terms est celle où j'ai trouvé le exclude-from-catalogterm_id

 enter image description here 

J'ai testé une page de produit sur le backend, puis cette requête dans MySQL/PHPMyAdmin

SELECT *
FROM wp_posts p
INNER JOIN wp_postmeta pm ON ( pm.post_id = p.ID AND pm.meta_key='_visibility' )
INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id)
INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
INNER JOIN wp_terms t ON (t.term_id = tt.term_id)
WHERE p.post_type = 'product'
and t.term_id = 7;

Et je peux voir le produit sur lequel je l'ai réglé avec tout un tas de colonnes.

 enter image description here 

Les post_id/object_id font tous deux référence à l'ID de page de produit que j'ai défini manuellement pour exclure du catalogue.

Mon problème est, si je fais une requête comme celle-ci

SELECT *
FROM wp_posts p
INNER JOIN wp_postmeta pm ON ( pm.post_id = p.ID AND pm.meta_key='_visibility' )
INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id)
INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
INNER JOIN wp_terms t ON (t.term_id = tt.term_id)
WHERE p.post_type = 'product'
and post_status = 'draft';

Elle renvoie toutes les méta de publication pour chaque instance de chaque page ... cette requête renvoie presque 400 000 résultats.

Voir comment wp_terms a évidemment une relation étroite avec wp_term_relationships et wp_term_taxonomy Je pense que cela ne va pas être une tâche simple.

De plus, il semble que seul un nouveau meta_id avec la taxonomyproduct_visibility soit créé uniquement lorsque vous spécifiez quelque chose dans le backend (tel que featured, outofstock ou exclude-from-catalog).

Est-ce une tâche impossible? Les termes WordPress/WooCommerce sont-ils structurés de sorte que je ne puisse pas le faire et que je doive définir manuellement un product_visibility pour chacun de mes produits brouillon dans wp-admin?

1
bbruman

Regardez dans wp_set_object_terms()

Vous pouvez faire quelque chose comme: wp_set_object_terms( $post_id, 'exclude-from-catalog', 'product_visibility' );

Pour obtenir tous les messages par statut, utilisez Wp_Query . J'ai ajouté le paramètre 'fields' => 'ids' pour limiter la requête aux seuls identifiants, plutôt que de collecter des objets post complets.

Sur un tableau de publications ayantBrouillon ou En attenteen tant que statut ou étantauto-brouillon

 function catalog_exclude_drafts() {
 $args = array(
               'post_type'   => 'product',
               'post_status' => array( 'pending', 'draft', 'auto-draft' ),
               'posts_per_page' => -1, 
               'fields'      => 'ids'
               );
            $drafts = new WP_Query( $args );
            $ids    = $drafts->posts;

            $map    = array_map( 'wrapper_for_set_obj', $ids );
 }

function wrapper_for_set_obj( $post_id ) {
    wp_set_object_terms( $post_id, 'exclude-from-catalog', 'product_visibility' );     
}

Vous pouvez accrocher ce qui précède (ou une variante perfectionnée) sur init pour exécuter une fois sur localhost ou quelque chose du genre. Accrochez vos brouillons à l’avenir, accrochez-le save_post . En fait, vous pouvez l'accrocher à save_post_products puisque WP 3.7 a introduit save_post{post_type}.

Mise à jour ponctuelle: add_action( 'init', 'catalog_exclude_drafts' );

Aller de l'avant: add_action( 'save_post_products', 'wrapper_for_set_obj' );

2
hwl