web-dev-qa-db-fra.com

wp_set_object_terms () ne réussit pas à définir les termes

Ok les gars, voici le scénario.

J'essaie de configurer une fonction qui dupliquera automatiquement une publication (lorsqu'elle sera publiée) sur un autre type de publication. Ainsi, un article de blog normal est publié et, une fois publié, toutes ses informations sont copiées dans un type d'article personnalisé (pour WP ECommerce), créant automatiquement une entrée de magasin pour cet article de blog.

J'ai écrit une fonction qui prend en charge toutes les informations et les insère dans une nouvelle publication avec wp_insert_post (). Tout fonctionne très bien, sauf pour une chose. J'utilise wp_set_object_terms () pour définir les identifiants de catégorie de magasin du nouveau produit en fonction des balises de l'article de blog. Cependant, pour une raison quelconque, wp_set_object_terms () ne fonctionne jamais.

Maintenant, voici le piège. J'exécute tout cela sur une installation multi-sites et j'utilise threeWP_Broadcast pour me permettre de publier plusieurs articles. Les articles de blog (qui doivent être copiés dans le magasin) sont publiés à partir d'un sous-site et diffusés sur le site principal. Le magasin est sur le site principal.

J'ai donc associé ma fonction personnalisée au plugin broadcast afin qu'elle soit déclenchée lorsqu'une publication est diffusée depuis un sous-site vers le site principal.

Tout avec ma fonction fonctionne très bien, sauf pour le wp_set_object_terms ()

Voici la fonction:

function copy_post_to_store_product() {

global $blog_id;
global $wpdb;

// only copy the post over if on main site, not subsites
if ($blog_id == 1) {

    $args = array('numberposts' => 1);
    $latest = get_posts($args);
    foreach($latest as $post) : setup_postdata($post);

        // if NOT Tip and NOT source avail, create product
        // if source, price is ALWAYS $4
        // auto create for source files only -- regular post type

        $custom_meta = get_post_custom($post->ID);

        // what kind of post is this?
        $post_type = $custom_meta['cgc_post_type'][0];
        // does this post have a source file product associated with it?
        $source_avail = $custom_meta['cgc_source_avail'][0];

        // source file price
        $price = '4';


        $product_info = array(
            'post_title'    => $post->post_title,
            'post_type'     => 'wpsc-product',
            'post_content'  => $post->post_content,
            'post_author'   => $post->post_author,
            'post_status'   => 'draft', 
        );


        if($post_type == 'Regular' && $source_avail == true) {
            // only auto create product for Regular posts that have source files for sale
            $product_id = wp_insert_post($product_info);
            update_post_meta($product_id, '_wpsc_price', $price);

            if (has_tag('blender', $post->ID)) 
            { 
                $product_cats = array(23,32);
            }
            elseif (has_tag('max', $post->ID)) {
                $product_cats = array(23,34);
            }
            elseif (has_tag('modo', $post->ID)) {
                $product_cats = array(23,19);
            }

            // set the product categories
            wp_set_object_terms($product_id, $product_cats, 'wpsc_product_category' );

        }


    endforeach;
}

}

La fonction fonctionne en récupérant la dernière publication du site principal ($ blog_id == 1) et en copiant toutes ses informations dans des variables pour wp_insert_post ().

Ce qui est vraiment intéressant, c’est que cela fonctionne parfaitement si j’attache la fonction à un hook publish_post, mais je ne peux malheureusement pas le faire car ce hook ne se déclenche pas lorsqu’une publication est diffusée.

Toutes les idées seraient extrêmement appréciées.

2
Pippin

Je n'ai pas de solution, mais il y a un ticket # 20541 sur Make WordPress Core.

Apparemment, un appel à switch_to_blog() ne repeuplerait pas $wp_taxomies, sur lequel s'appuient ces taxonomies.

0
Nick Budden

Je viens de rencontrer le même problème et de trouver une solution à l'aide de réponse de Patriek . Vous devez simplement vous assurer que wp_set_object_terms() est exécuté après l'enregistrement de la taxonomie personnalisée. Étant donné que register_taxonomy() est généralement exécuté à init, vous pouvez également exécuter votre fonction au point d'ancrage d'action init, mais avec une priorité inférieure pour qu'il soit exécuté ultérieurement.

add_action( 'init', 'register_custom_taxonomies', 0 );

function register_custom_taxonomies() {
    // register your taxonomies here    
}

add_action( 'init', 'copy_post_to_store_product', 10)

function copy_post_to_store_product() {
    // your function that runs wp_set_object_terms() here
}

De cette façon, la taxonomie est garantie d'être disponible lorsque votre fonction est exécutée.

2
Dalton

Oubliez la réponse précédente. Vous dites que cela fonctionne bien avec publish_post hook, puis vous créez un plugin dans votre mu-plugins (plugins "incontournables") auquel vous pouvez accrocher votre fonction et simplement ajouter switch_to_blog avant de commencer à insérer et à mettre à jour les choses dans la base de données puis revenir en arrière en utilisant restore_current_blog() Donc

switch_to_blog($main_blog_id); //usually 1
...
//your function
...
restore_current_blog();
1
Bainternet

En jetant ça: j'ai eu un problème similaire une fois où une taxonomie n'était pas disponible au moment où ma fonction était en cours d'exécution. Cela pourrait être un problème avec wp ecommerce ou le plugin broadcast.

Vérifiez si le plug-in wp ecommerce utilise cette syntaxe pour enregistrer leur taxonomie

add_action( 'init', 'taxonomy_function_name', 0 );

Vérifiez s’ils ont ajouté le, 0. Ceci définit la priorité de la fonction taxonomie sur 0. Ce serait le plus tôt possible.

Est-il possible de définir une priorité pour le hook de diffusion?

1
Patriek

j'ai la solution,

j'ai examiné le fichier taxonomy.php, puis j'ai trouvé que le problème se trouvait sur la fonction taxonomy_exists(). Puisque la fonction switch_to_blog() ne lit pas le code du thème et du plug-in, elle ne détectera donc pas notre taxonomie enregistrée sur l'autre blog. Nous devons donc l'initialiser manuellement, juste avant la fonction taxonomy_exists().

Placez ce code avant la fonction wp_set_object_terms():

global $wp_taxonomies;
$wp_taxonomies['your_blog_taxonomy'] = array();
0
harisrozak

Après avoir essayé tant d'essais et d'erreurs, j'ai constaté que le véritable problème, c'est que vous devez définir votre fonction de configuration d'une taxonomie pour CTP dans Init avec une priorité basse.

add_action( 'init', 'your_function_product', 20 );

0
gurcharan

merci les gars, vous m'avez sauvé la vie :)
La priorité basse (20) pour la fonction qui insère le (s) post (s) fera l'affaire! Voici une approche pour wp_insert_post () in functions.php:

function insert_db_posts() {
        $thepost = wp_insert_post(array(
                'post_type'         =>  'art',
                'post_title'        =>  'Try hard',
                ));
        wp_set_object_terms( $thepost, 37, 'artist');
}
add_action( 'init', 'insert_db_posts', 20 ); // this will fire very late so everything else is already initialized before this!!!
0
Alex DS