WP_SET_OBJECT_Terms()无法设置术语

时间:2011-04-25 作者:Pippin

好了,伙计们,这是一个场景。

我正在尝试设置一个函数,该函数将自动将一篇帖子(发布时)复制到另一种帖子类型。因此,一篇常规的博客文章被发布,发布后,它的所有信息都被复制到一个自定义的帖子类型(对于WP电子商务),自动为该博客文章创建一个存储条目。

我编写了一个函数,该函数负责提取所有信息,并使用wp\\u insert\\u post()将其插入到新帖子中。这一切都很好,除了一件事。我正在使用wp\\u set\\u object\\u terms()根据博客文章的标记设置新产品的商店类别ID。然而,由于某些原因,wp\\u set\\u object\\u terms()永远不起作用。

现在,这里有一个陷阱。我正在多站点安装上运行所有这些,并使用threeWP_Broadcast 允许我交叉发布帖子。博客帖子(必须复制到商店)从子站点发布并广播到主站点。这家商店位于主场地上。

因此,我将我的自定义函数连接到广播插件中,以便在将帖子从子站点广播到主站点时触发它。

除了wp\\u set\\u object\\u terms()之外,我的函数的所有功能都很好

功能如下:

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

该函数的工作方式是从主站点检索最新的帖子($blog\\u id==1),并将其所有信息复制到wp\\u insert\\u post()的变量中。

现在,真正有趣的是,如果我将该函数附加到publish\\u post挂钩上,它将非常有效,但不幸的是,我无法做到这一点,因为播发帖子时该挂钩不会触发。

任何想法都将不胜感激。

7 个回复
最合适的回答,由SO网友:Nick Budden 整理而成

我没有办法,但有一个ticket #20541 在Make WordPress Core上。

显然是打电话给switch_to_blog() 不会重新填充$wp_taxomies, 这些分类学所依赖的。

SO网友:Dalton Rooney

我只是遇到了同样的问题,并在Patriek\'s answer. 你只需要确保wp_set_object_terms() 在注册自定义分类后运行。自从register_taxonomy() 通常运行于init, 您还可以在以下位置运行函数:init 操作挂钩,但优先级较低,因此它会稍后运行。

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
}
这样,可以保证在运行函数时分类法可用。

SO网友:Bainternet

忘了前面的答案吧,你说它对publish_post 挂钩然后在mu插件(“必须使用”插件)中创建一个插件,您可以将您的功能挂钩到该插件上,只需添加switch_to_blog 在开始在数据库中插入和更新内容,然后使用restore_current_blog()所以

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

SO网友:Patriek

简单地说一下:我曾经遇到过一个类似的问题,在我的函数运行时,分类法不可用。这可能是wp电子商务或广播插件的问题。

检查wp电子商务插件是否使用此语法注册其分类

add_action( \'init\', \'taxonomy_function_name\', 0 );
检查他们是否附加了0。这将分类功能的优先级设置为0。那就越早越好。

是否可以为广播挂钩设置优先级?

SO网友:harisrozak

我已经找到了解决方案,

我已经调查了taxonomy.php 文件,然后我发现问题出在函数上taxonomy_exists(). 自switch_to_blog() 函数不读取主题和插件代码,因此它不会检测到我们在其他博客上注册的分类法,因此我们需要在taxonomy_exists() 作用

将此代码置于wp_set_object_terms() 功能:

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

SO网友:gurcharan

在尝试了这么多尝试和错误之后,我发现真正的问题是,您需要在Init中设置低优先级的CTP分类法。

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

SO网友:Alex DS

谢谢你们,你们救了我的命:)
插入帖子的功能优先级低(20)就可以了!以下是wp_insert_post() 在函数中。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!!!

结束

相关推荐

从管理区域的Taxonomy编辑屏幕中删除“Popular Terms”区域

就我个人而言,我真的不喜欢wordpress在管理区域的分类法添加/编辑屏幕上以不同大小显示所有“流行术语”。有人知道通过向函数中添加代码来完全删除整个区域的方法吗。php文件和/或如何更改此特定区域,使所有流行术语都不会显示不同的字体大小/样式?非常感谢。