it-swarm.com.de

wp_set_object_terms () kann keine Begriffe setzen

Okay Leute, hier ist das Szenario.

Ich versuche, eine Funktion einzurichten, die einen Beitrag (bei Veröffentlichung) automatisch auf einen anderen Beitragstyp kopiert. Daher wird ein regulärer Blog-Beitrag veröffentlicht, und wenn er veröffentlicht wird, werden alle seine Informationen in einen benutzerdefinierten Beitragstyp (für WP ECommerce) kopiert, wodurch automatisch ein Geschäftseintrag für diesen Blog-Beitrag erstellt wird.

Ich habe eine Funktion geschrieben, die dafür sorgt, dass alle Informationen erfasst und mit wp_insert_post () in einen neuen Beitrag eingefügt werden. Es funktioniert alles super, bis auf eine Sache. Ich verwende wp_set_object_terms (), um die Shop-Kategorie-IDs des neuen Produkts basierend auf den Tags des Blogposts festzulegen. Aus irgendeinem Grund funktioniert wp_set_object_terms () jedoch nie.

Hier ist der Haken. Ich führe all dies auf einer Installation mit mehreren Standorten aus und verwende threeWP_Broadcast , um Cross-Publish-Posts zu ermöglichen. Die Blog-Posts (die in den Store kopiert werden müssen) werden von einer Unter-Site veröffentlicht und an die Haupt-Site gesendet. Der Laden befindet sich auf der Hauptseite.

Daher habe ich meine benutzerdefinierte Funktion in das Broadcast-Plugin eingebunden, damit sie ausgelöst wird, wenn ein Beitrag von einer untergeordneten Site zur Haupt-Site gesendet wird.

Alles mit meiner Funktion funktioniert super, bis auf die wp_set_object_terms ()

Hier ist die Funktion:

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;
}

}

Die Funktion ruft den neuesten Beitrag von der Hauptseite ab ($ blog_id == 1) und kopiert alle seine Informationen in Variablen für wp_insert_post ().

Das wirklich Interessante ist, dass es perfekt funktioniert, wenn ich die Funktion an einen publish_post-Hook anhänge, aber das kann ich leider nicht, weil dieser Hook nicht ausgelöst wird, wenn ein Post gesendet wird.

Alle mögliche Ideen würden sehr geschätzt.

2
Pippin

Ich habe keine Lösung, aber es gibt ein Ticket # 20541 für Make WordPress Core.

Offensichtlich würde ein Aufruf von switch_to_blog() den $wp_taxomies, auf den sich diese Taxonomien stützen, nicht erneut ausfüllen.

0
Nick Budden

Ich bin auf dasselbe Problem gestoßen und habe mit Hilfe von Patrieks Antwort eine Lösung gefunden. Sie müssen nur sicherstellen, dass wp_set_object_terms() ausgeführt wird, nachdem die benutzerdefinierte Taxonomie registriert wurde. Da register_taxonomy() normalerweise unter init ausgeführt wird, können Sie Ihre Funktion auch unter init action hook ausführen, jedoch mit einer niedrigeren Priorität, damit sie später ausgeführt wird.

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
}

Auf diese Weise ist die Taxonomie garantiert verfügbar, wenn Ihre Funktion ausgeführt wird.

2
Dalton

Vergiss die vorherige Antwort. Du sagst, dass es gut mit publish_post hook funktioniert, dann erstellst du ein Plugin in deinen mu-plugins ("must-use" -Plugins), mit dem du deine Funktion verknüpfen und einfach switch_to_blog hinzufügen kannst, bevor du mit dem Einfügen und Aktualisieren beginnst Dinge in der Datenbank und dann wieder mit restore_current_blog() So

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

Wirf das einfach raus: Ich hatte einmal ein ähnliches Problem, bei dem eine Taxonomie zum Zeitpunkt der Ausführung meiner Funktion nicht verfügbar war. Dies könnte entweder ein Problem mit wp E-Commerce oder dem Broadcast-Plugin sein.

Überprüfen Sie, ob das WP-E-Commerce-Plugin diese Syntax für die Registrierung der Taxonomie verwendet

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

Überprüfen Sie, ob sie die 0 angehängt haben. Dies setzt die Priorität der Taxonomiefunktion auf 0. Dies wäre so früh wie möglich.

Ist es möglich, eine Priorität für den Broadcast-Hook festzulegen?

1
Patriek

ich habe die lösung,

ich habe die taxonomy.php-Datei untersucht und festgestellt, dass das Problem bei der Funktion taxonomy_exists() liegt. Da die switch_to_blog() -Funktion den Theme- und Plugin-Code nicht liest, erkennt sie unsere registrierte Taxonomie auf dem anderen Blog nicht. Deshalb müssen wir dies kurz vor der taxonomy_exists() -Funktion manuell einleiten

Stellen Sie diesen Code vor die Funktion wp_set_object_terms():

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

Nachdem ich so viele Versuche unternommen habe, habe ich festgestellt, dass das eigentliche Problem darin besteht, dass Sie Ihre Funktion zum Einrichten einer Taxonomie für CTP in Init mit niedriger Priorität festlegen müssen.

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

0
gurcharan

danke Jungs, du hast mein Leben gerettet :)
Niedrige Priorität (20) für die Funktion, die den/die Beitrag (e) einfügt, erledigt den Trick! Hier ist ein Ansatz für 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