有两个问题阻碍了您的检查:
$term = get_queried_object()->term_id;
if ( $term->parent == \'tradeshow\' ) {
从以下内容开始:
$term = get_queried_object()->term_id;
在这里
$term
包含术语的ID,而不是术语对象。假设这是第5个术语,结果是:
$term = 5;
if ( $term->parent == \'tradeshow\' ) {
这行不通。
$term
是数字,不是对象,所以你不能
->parent
在上面。
修复方法是直接使用查询的对象:
$term = get_queried_object();
这就引出了下一个问题:
if ( $term->parent == \'tradeshow\' ) {
父项不是字符串,而是术语ID。
0
如果没有父项,则为父项的ID,如查找时所示
WP_Term
:
/**
* ID of a term\'s parent term.
*
* @since 4.4.0
* @var int
*/
public $parent = 0;
因此,您需要提前获取tradeshow术语以找到其ID。通常,对于这些场景,开发人员不会硬编码slug,而是提供一个列出术语的设置,并将ID存储为一个选项,以避免此类查找,并增加灵活性
但在这种情况下,您可以使用get_term_by
功能,例如。
$tradeshow = get_term_by(\'slug\', \'tradeshow\', \'events\')
然后使用:
$tradeshow->term_id === $term->parent
问题和建议这些都是我想提及的不相关的附加项目
使用调试var_dump
, 调试器或其他工具,以查看$term
会暴露出这些问题。
此外,PHP错误日志将充满警告和通知,这些警告和通知指向试图执行等效于5->parent
这对PHP来说毫无意义。注意错误日志。我建议使用查询监视器插件作为捕获意外警告的简单方法
查询的对象并不总是一个术语
此代码将在每次页面加载时运行:
add_filter( \'template_include\', \'kd_event_subcategory_archive\' );
function kd_event_subcategory_archive( $template ) {
$term = get_queried_object()->term_id;
if ( $term->parent == \'tradeshow\' ) {
但是,如果用户访问日期档案或作者档案怎么办?现在代码仍在运行,产生错误。因此,此过滤器需要测试以检查用户是否在分类法存档中,以及分类法是否匹配。
它甚至可能是一篇单篇文章,如果贸易展术语的术语ID为5,并且您位于ID为5的文章或页面上,那么您将在分类法存档中看到一篇文章。
但我怀疑使用单独的分类法会更容易。
https://codex.wordpress.org/Function_Reference/get_queried_object
- 如果您在一篇文章上,它将返回post对象如果您在一个页面上,它将返回page对象如果您在存档页面上,它将返回post类型对象如果您在类别存档中,它将返回category对象如果您在作者存档中,它将返回author对象等