Wordpress 使用未初始化的名称值按名称获取术语

Wordpress 使用未初始化的名称值按名称获取术语,wordpress,themes,Wordpress,Themes,我想做的是通过编程设置woocommerce产品类别 我拥有的是术语名称

我想做的是通过编程设置woocommerce产品类别

我拥有的是术语名称
和post id
9
,因此要设置我使用的产品类别
wp\u set\u object\u terms

$name  = 'test & sample';
$posid = 9;
//get the term based on name
$term = get_term_by('name', $name, 'product_cat');
//set woocommerce product category
wp_set_object_terms($posid, $term->term_id, 'product_cat');
正如您所看到的,我的问题是
$name
的未初始化值。 到目前为止,我所做的是用
&;替换
哪一个有效

$name = str_replace('&', '&', 'test & sample');
$posid = 9;
//get the term based on name
$term = get_term_by('name', $name, 'product_cat');
//if term does exist,then use set object terms
if(false != $term){
  //set woocommerce product category
  wp_set_object_terms($posid, $term->term_id, 'product_cat');
}
//if the term name doe not exist I will do nothing
我的问题是如何使用未初始化的名称或值按名称获取术语
如何清理名称值以正确获取术语id。

您可以尝试使用
$name=esc\u html($name)清理
$name
get\u term\u by()
之前,请执行code>。我相信wordpress会将术语、文章标题、文章内容等方面的特殊HTML字符转换为相应的HTML实体,以便在呈现页面时正确显示字符

例如:

$name = esc_html('test & sample'); // cleanses to 'test & sample'
$posid = 9;
$term = get_term_by('name', $name, 'product_cat');
wp_set_object_terms($posid, $term->term_id, 'product_cat');
请尝试以下操作:

$name  = 'test & sample';
$postid = 9;
$term = get_term_by('name', apply_filters( 'pre_term_name', $name, 'product_cat'), 'product_cat');
if (is_object($term)) 
{
    wp_set_object_terms($postid, $term->term_id, 'product_cat');
}

Wordpress通过
sanitize_term_字段
(在一系列函数之后,它完成了真正的工作)来清理术语名称。我们可以看到,
名称
通过两个过滤器:
'edit\u term\u name'
'edit\u category\u name'
(第1880和1893行)。wordpress似乎没有向这些过滤器插入任何函数,因此唯一的转换发生在第1898行<代码>$value=esc\u attr($value)


也就是说,您可以使用
$name=esc_attr('test&sample')这样就可以了;)

“清理”标题不起作用,因为它将替换为-和没有空格的空格。@jameshwartlopez这正是重点<当您在wp admin的tag input(标签输入)字段中输入时,code>sanitize_title
将产生一个
slug
get\u term\u by
然后将通过
slug
查找术语。您也可以省略
get\u term\u by
,只需将未初始化的名称传递给
wp\u set\u object\u terms
,如我答案中最后一行代码所示。如果不存在,它将创建一个术语;如果存在,则使用现有术语。你有没有试过在说它不起作用之前?实际上
get\u term\u by('slug'
不需要,这不是我需要的,因为我想通过名字而不是slug来获取术语。我的问题是逃避名称。我希望你能理解我。我不明白你从哪里得到它,它不需要消毒。我不知道你为什么如此热衷于通过
名称而不是
slug
来获取它。你知道吗sult仍然是一样的-如果分类法不存在,您仍然会得到false,如果分类法不存在,
wp_term
object,则仍然会得到false。在我发布的链接的第857行上。您可以看到,使用相同的代码清理_title()对值进行了清理如果'slug'=$field。为什么我想使用name而不是slug是因为这是我从wp外部获得的唯一信息。我只有name来检查产品是否应该有一个类别。这就是为什么我需要name而不是slug。我从api响应中获得类别名称,所以我认为最好的选择是,如果woo中确实存在这个术语,就按名称获取它。如果类别名称在woo中不存在,则没有理由创建类别。它应该从术语名称中转义任何html字符,例如
,以及
&
,wordpress在将标记名称保存到数据库中之前会对标记名称进行转义,以便它们只需清理一次,而不必在显示术语名称时进行清理。T他应该会帮你找到正确的术语,只有名字。谢谢你的帮助。另外一个给你:)谢谢你的帮助。另外一个给你:)