如何通过WordPress Customizer设置文章查询的category_name参数?
嘿,我完全懂你现在卡在哪了——你想把Customizer里客户输入的首页栏目标签分类名,传递给WP_Query的参数数组,但写的代码里因为用了echo导致持续报错,对吧?咱们来一步步把这个问题捋清楚,搞定它。
先说说你代码里的核心问题
你原来的代码里这一行是关键错误:
'category_name' => echo get_theme_mod( 'column_1_category');
在PHP的数组键值对定义里,不能用echo——echo是用来把内容输出到页面的,而我们这里需要的是把get_theme_mod()的返回值直接赋值给category_name这个键,echo在这里完全多余,还会直接触发语法错误。另外你原来的if语句后面多了个分号,会导致后续的$args定义不在if的判断范围内,这也是个潜在的逻辑问题。
正确的代码写法
我们先把Customizer里的值取出来存成变量,再判断赋值,代码会更清晰,也不会出错:
// 先获取自定义器中设置的分类slug(注意:category_name参数接受的是分类slug,不是显示名称) $column_1_category = get_theme_mod('column_1_category', ''); // 只有当分类值不为空时,才构建查询参数 if (!empty($column_1_category)) { $args = array( 'category_name' => $column_1_category, // 直接用变量赋值,不需要echo 'posts_per_page' => 2 ); // 接下来就可以执行查询并输出文章了 $column_1_query = new WP_Query($args); if ($column_1_query->have_posts()) { while ($column_1_query->have_posts()) { $column_1_query->the_post(); // 这里写你的文章输出模板,比如标题、摘要等 the_title('<h3>', '</h3>'); the_excerpt(); } wp_reset_postdata(); // 别忘了重置查询 } }
额外的优化建议
注意
category_name的参数要求:这个参数接受的是分类的slug(也就是分类的别名,比如分类显示名称是“科技”,slug可能是“tech”),不是分类的显示名称。如果客户在Customizer里输入的是显示名称,查询会失效,所以最好在Customizer的控件说明里提醒客户输入分类slug,或者直接改成下拉选择框,避免输入错误。把Customizer控件改成下拉选择(更友好):与其让客户手动输入slug,不如给他们一个分类下拉列表,这样更直观也不容易出错。在
customizer.php里可以这么写:
// 先获取所有分类,生成下拉选项 $category_choices = array(); $categories = get_categories(array('hide_empty' => false)); $category_choices[''] = __('请选择分类', '你的主题slug'); foreach ($categories as $category) { $category_choices[$category->slug] = $category->name; } // 添加自定义器控件 $wp_customize->add_control('column_1_category', array( 'label' => __('第一栏分类', '你的主题slug'), 'section' => '你的首页设置区块ID', // 替换成你实际的section ID 'type' => 'select', 'choices' => $category_choices, ));
这样客户只需要从下拉列表里选分类,不用记slug,体验更好。
最后再确认下
你原来的customizer.php里定义的column_1_category是没问题的,只要把查询参数里的echo去掉,用变量直接赋值,就能正常把分类名(slug)传递给WP_Query了。
内容的提问来源于stack exchange,提问作者Cory

