Question

Bon les gars, voici le scénario.

Je suis en train d'installer une fonction qui dupliquer automatiquement un poste (lors de la publication) à un autre type de poste. Ainsi, un blog régulier est publié, et quand il est publié, toutes ses informations sont copiées sur un type de poste personnalisé (pour WP eCommerce), ce qui crée automatiquement une entrée de magasin pour ce poste de blog.

J'ai écrit une fonction qui prend soin de ramasser toutes les informations et l'insérer dans un nouveau poste avec wp_insert_post (). Tout fonctionne très bien, sauf pour une chose. J'utilise wp_set_object_terms () pour définir les ids de catégorie de magasin du nouveau produit basé sur les balises du billet de blog. Cependant, pour une raison quelconque, wp_set_object_terms () ne fonctionne jamais.

Maintenant, voici les prises. Je suis en tout cela sur un site à plusieurs installer et je suis en utilisant threeWP_Broadcast pour permettre moi de traverser publier les messages. Les messages de blog (qui doivent être copiés dans le magasin) sont publiés à partir d'un sous-site et retransmises sur le site principal. Le magasin est sur le site principal.

Je l'ai accroché ma fonction personnalisée dans la diffusion plug-in afin qu'il soit déclenché quand un poste est diffusé à partir d'un sous-site vers le site principal.

Tout avec ma fonction fonctionne très bien, sauf pour les 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;
}

}

Les travaux de fonction en récupérant le dernier message du site principal ($ blog_id == 1) et la copie toutes ses informations dans des variables pour wp_insert_post ().

Maintenant, la chose vraiment intéressante est que fonctionne parfaitement si j'attache la fonction à un crochet de publish_post, mais, malheureusement, je ne peux pas le faire parce que le crochet ne se déclenche pas lorsqu'un poste est diffusé.

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

Était-ce utile?

La solution

Je n'ai pas une solution, mais il y a un ticket # 20541 sur faire WordPress de base.

Apparemment, un appel à switch_to_blog() ne serait pas Repeuplement $wp_taxomies, que ces taxonomies comptent sur.

Autres conseils

Je viens suis tombé sur le même problème et a élaboré une solution avec l'aide de réponse de Patriek. Vous devez juste vous assurer que wp_set_object_terms() est exécuté après la taxonomie personnalisée est enregistrée. Depuis register_taxonomy() est habituellement exécuté à init, vous pouvez également exécuter votre fonction au crochet d'action init, mais avec une priorité inférieure il court plus tard.

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 disponible lorsque votre fonction est exécutée.

Oublier la réponse précédente, vous dites que cela fonctionne très bien avec crochet publish_post vous créez un plug-in dans vos mu-plugins (plugins « must-utilisation ») que vous pouvez brancher votre fonction et ajouter juste switch_to_blog avant de commencer l'insertion et la mise à jour des choses dans la base de données et revenir ensuite à l'aide de retour restore_current_blog() Donc,

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

Il suffit de jeter ce là-bas: j'ai eu un problème similaire une fois où une taxonomie n'a pas été disponible au moment où ma fonction était en cours d'exécution. Cela pourrait être un problème avec le commerce électronique wp ou le plug-in de diffusion.

Vérifiez si le plugin ecommerce wp utilise cette syntaxe pour l'enregistrement de leur taxonomie

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

Vérifiez si elles ajoutées le, 0. Ceci définit la priorité de la fonction de la taxonomie à 0. Ce qui serait le plus tôt possible.

Est-il possible de priorité définie pour le crochet de diffusion?

i ont obtenu la solution,

J'ai étudié le fichier taxonomy.php, alors je trouve que le problème est sur la fonction taxonomy_exists(). Étant donné que la fonction switch_to_blog() ne lisent pas le thème et le code plugin, il ne détectera pas notre taxonomie enregistrée sur l'autre blog, donc nous avons besoin init manualy que, juste avant la fonction taxonomy_exists()

Mettre ce code avant la fonction wp_set_object_terms():

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

Après avoir essayé tant tâtonnement que j'ai trouvé le vrai problème est que vous devez définir votre fonction de mise en place d'une taxonomie pour le CTP en Init avec une faible priorité.

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

merci les gars, vous avez sauvé ma vie :)
Priorité faible (20) pour la fonction qui insère le poste (s) fera l'affaire! Voici une approche pour wp_insert_post () 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!!!
Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top