我的Wordpress网站使用类别将产品信息分组到子类别中。例如,对于汽车来说,父类别是品牌,子类别包括本田、丰田、福特等。有时一个职位可以分配多个子类别。此外,有时父+子类别从未分配给帖子。我正在使用自定义页面模板。
我的代码可以工作,但我担心它效率低下,并且会降低我的网站速度
以下是基本要素:
functions.php
global $reviews_cat_id_brand;
$reviews_cat_id_brand = 158; // using # in case string changes
if( !function_exists(\'reviews_has_subcat_link\') ){
function reviews_has_subcat_link($cat_id){
$taxonomy_name = \'review-category\';
// store category data in array
$cat_array = get_term_by(\'id\', $cat_id, $taxonomy_name);
$terms = get_the_terms(get_the_ID(), $taxonomy_name);
foreach ($terms as $term) {
if($term->parent === $cat_array->term_id) {
return true;
}
}
}
}
if( !function_exists(\'reviews_print_subcat_link\') ){
function reviews_print_subcat_link($cat_id){
$taxonomy_name = \'review-category\';
// store category data in array
$cat_array = get_term_by(\'id\', $cat_id, $taxonomy_name);
$terms = get_the_terms(get_the_ID(), $taxonomy_name);
$subcat_array = [];
foreach ($terms as $term) {
if($term->parent === $cat_array->term_id) {
$subcat_array[] = \'<a href="\'.get_term_link($term).\'">\'.$term->name.\'</a>\';
}
}
echo implode(\', \', $subcat_array);
}
}
review-page.php
<?php if( reviews_has_subcat_link($reviews_cat_id_brand) ): ?>
<tr><td>Brand:</td>
<td><?php reviews_print_subcat_link($reviews_cat_id_brand); ?></td></tr>
<?php endif; ?>
就是这样。每个评论页面都有大约6个这样的子类别检查,该站点有几百个页面。有没有更好的方法?
在Wordpress编辑器中,当存在子类别时,我会检查父类别。理想情况下,我希望检测是否选中了父对象,然后显示所选的子对象,而不必每次都遍历所有内容。
提前感谢您的指导。
SO网友:sinisterOrange
查看之后get_the_terms() 我想我又找到了一个更好的解决方案:
functions.php
global $reviews_cat_id_brand;
$reviews_cat_id_brand = 158; // using # in case string changes
if( !function_exists(\'reviews_print_subcat_link\') ){
function reviews_print_subcat_link($cat_id){
$items = get_the_terms(get_the_ID(), \'review-category\');
$subcat_array = [];
foreach ($items as $item) {
if($item->parent === $cat_id) {
$subcat_array[] = \'<a href="\'.get_term_link($item).\'">\'.$item->name.\'</a>\';
}
}
return $subcat_array;
}
}
review-page.php
$reviews_subcat_links_brand = reviews_print_subcat_link($reviews_cat_id_brand);
if ($reviews_subcat_links_brand) {
echo \'<tr><td>Brand:</td>\';
echo \'<td>\'.implode(\', \', $reviews_subcat_links_brand).\'</td></tr>\';
}
也许还有更好的解决方案,但这会大大减少循环。