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;
}
}
最合适的回答,由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] );
}