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-catalog
term_id
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.
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 taxonomy
product_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?
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' );