WP_SET_OBJECT_TERMS()不会替换Term,而是创建新的Term

时间:2014-10-30 作者:Mayeenul Islam

如果我使用以下硬代码,请从自定义子菜单页:

$post_id = 111;
$flightCategory = array( 25 );
wp_set_object_terms( $post_id, $flightCategory, \'flight_categories\' );
并刷新页面,它只需将所需的自定义分类术语分配给CPT。但是如果我继续下面的代码,我将从<form>, 它不像以前那样工作。

if( $flightID !== NULL && $flightCat !== \'-1\' && !empty( $flightCat ) ) {
    $flightCount = count( $flightID );
    foreach ( $flightID as $post_id ) {
        $flightCategory = array( $flightCat ); //inactive = 25, active = 26
        wp_set_object_terms( $post_id, $flightCategory, \'flight_categories\' );
    }
    $success = sprintf( __(\'<strong>SUCCESS:</strong> %d Flight information has been affected\', \'textdomain\'), $flightCount);
} else {
    $error = __(\'<strong>ERROR:</strong> You can\\\'t pass any empty field\', \'textdomain\');
}
这个代码块的作用是,它简单地添加了名为“25”的新术语和slug“25”。我尝试不传递如下数组:

$flightCategory = $flightCat;
但结果是一样的。我做错了什么?

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

在这两种情况下,问题不在于其他方面,而在于发送给第二个参数的主要值$flightCategory:

$flightCategory = array( 25 );
var_dump( $flightCategory );
wp_set_object_terms( $post_id, $flightCategory, \'flight_categories\' );
但在后来的版本中,不知怎么的,或者说你实际上是在传递下面这样的信息:

$flightCategory = array( \'25\' );
var_dump( $flightCategory );
wp_set_object_terms( $post_id, $flightCategory, \'flight_categories\' );
你注意到了吗25? 这实际上是问题的根源。因为在第一次代码转储时,您将看到:

array(1) { [0]=> int(25) }
第二个是:

array(1) { [0]=> string(2) "25" }
实际上,您传递的是一个字符串,函数理解这一点,好的,我得到了Term name, 就这样吧。但对于一个整数,您实际上是在说,嘿,函数,现在得到了术语ID,只添加/更新ID。

解决方案要解决问题,您必须做一件简单的事情:

$flightCategory = (int)$flightCat; //make it integer whatever you get
或者,

$flightCategory = array( (int)$flightCat );  //make the array value integer whatever you get
了解更多有关PHP Type casting.

结束

相关推荐

如何执行一个SQL查询来排除表wp_Terms中除自定义分类术语之外的所有术语?

问题摘要:我正在尝试编写一个只返回自定义分类术语的SQL查询,但该表(wp\\u terms)包含所有术语,甚至包括我不需要的术语(例如类别术语和nav\\u菜单术语)。This is my present query:function myajax_inputtitleSubmit_func() { global $wpdb; global $customTerms; $acInput = $_GET[\'input\']; $mydb = new wpdb(\