在保存帖子时,如何以编程方式将自定义分类术语添加到自定义类型帖子中?

时间:2013-04-30 作者:MrValueType

Scenario: 网站上有一个“推荐书籍”部分,使用“书籍”自定义帖子类型和“作者”自定义分类法。我正在使用亚马逊产品广告API来检索书籍数据和封面。在WordPress中添加新的“图书”时,用户将图书ID(ASIN)复制到后期编辑字段,然后单击“发布”。然后,在保存帖子时,应该通过Amazon以编程方式填写帖子标题(书名)和作者分类术语。(这些用于在前端提供“订购人”功能。)

目前我正在使用wp_insert_post_data 连接到“book”保存过程wp_set_object_terms 函数尝试将自定义分类术语添加到“book”。

The problem is: 这个wp_set_object_terms 功能似乎不起作用。它不会添加任何内容,尽管它返回一个数组,根据Codex的说法,这应该意味着成功。虽然返回数组很奇怪(据我所见)。使用post ID 107和term ID 3(出于测试目的,不是作者字符串)时,返回的数组显示以下内容print_r:

Array
(
[0] => 3
)
(也尝试了wp_set_post_terms, 这没有什么区别。)

我的完整功能:

// Function to automatically retrieve and store Amazon Book data (title and author) when adding \'book\' type posts
if( function_exists(\'asa_item\') ) {
    add_filter( \'wp_insert_post_data\', \'filter_handler\', \'99\', 2 );
    function filter_handler( $data , $postarr ) {

        // Proceed only if book is added/edited
        if ( $postarr[\'post_type\'] !== \'book\')
            return $data;

        // Try to Extract ASIN from post body; ignore everything else
        if ( preg_match( \'/([0-9A-Z]{10})/\', $data[\'post_content\'],  $matches) ) {
            // Successful, store ASIN
            $book_asin = $matches[0];
            // Wrap ASIN in AmazonSimpleAdmin shortcode (with \'cover\' template) automatically for user convenience
            $data[\'post_content\'] = \'[asa cover]\' . $matches[0] . \'[/asa]\';
        } else {
            // Unsuccessful: set to draft, return and show error message
            $data[\'post_status\'] = \'draft\';
            add_filter(\'redirect_post_location\', \'my_redirect_post_location_filter_1\', 99);
            return $data;
        }

        // Retrieve and store book data from Amazon with AmazonSimpleAdmin plugin
        $book_data = explode( "<sep>", asa_get_item( $book_asin, \'book_data\' ) );
        /******************
         * index 0 = title
         * index 1 = author
         ******************/

        // Check data; if no data, set to draft, return and show error message
        if ( $book_data[0] == \'\' ) {
            $data[\'post_status\'] = \'draft\';
            add_filter(\'redirect_post_location\', \'my_redirect_post_location_filter_2\', 99);
            return $data;
        }

        // Fill in Post Title with Amazon data if empty
        if ( $data[\'post_title\'] == \'\' )
            $data[\'post_title\'] = $book_data[0];

        // Fill in Author tag with Amazon data if missing
        if ( ! has_term( $book_data[1], \'author\', $postarr[\'ID\'] ) ) {
            wp_set_object_terms( $postarr[\'ID\'], $book_data[1], \'author\' );
        }

        return $data;
    }
}

1 个回复
最合适的回答,由SO网友:MrValueType 整理而成

所以,回答我自己的问题:

我在里面没有找到任何解决办法wp_insert_post_data. 我怀疑问题与以下事实有关:wp_insert_post_data 正在执行的帖子尚未在数据库中。虽然我没能在taxonomy.php, 合理的假设是wp_set_post_terms 函数有一些检查机制,以避免插入带有任意/不存在的post ID的术语关系。

无论如何,在wp_insert_post_data 我定义了一个全局变量来存储需要添加的税务术语(而不是尝试在本地添加)。然后我迷上了save_post, 在保存帖子并从中检索/插入术语后执行。

看起来很好用。

中的相关代码部分wp_insert_post_data:

...

// Fill in Author tag with Amazon data if missing
if ( ! has_term( $book_data[1], \'author\', $postarr[\'ID\'] ) ) {
    global $add_this_tax_term_to_book;
    $add_this_tax_term_to_book[] = $book_data[1];
    $add_this_tax_term_to_book[] = \'author\';
}

...
以及save_post:

add_action(\'save_post\', \'add_my_tax_term\');
function add_my_tax_term( $post_id ) {
    global $add_this_tax_term_to_book;

    if ( !(empty( $add_this_tax_term_to_book )) ) {
        wp_set_object_terms( $post_id, $add_this_tax_term_to_book[0], $add_this_tax_term_to_book[1] );
}

结束

相关推荐

使用$TERMS的分层视图的分类下拉列表

我在Wordpress论坛上问过这个问题,但现在没有得到任何回复,我希望我可以在这里问。我找到密码了here 我的代码是:function exc_custom_taxonomy_dropdown( $taxonomy, $orderby, $order, $hierarchical, $show_count, $name) { $args = array( \'orderby\' => \'name\', \'order\' =&g