php - WP_QUERY,ARRAYS,如果有多个类别,则重复帖子
问题描述
我有一个带有 wp_query 循环的简码,它输出一个类别列表作为导航和帖子列表。原始代码要复杂得多,因此我尝试删除不必要的行以便更好地理解。
function filter_shortcode($atts, $content = null) {
global $post;
$attributes = shortcode_atts(
array(
'type' => '',
'num' => -1
), $atts);
$args = array(
'post_type' => $attributes["type"],
'posts_per_page' => $attributes["num"]
);
$post_query = new WP_Query($args);
$master_array = array();
if ($post_query->have_posts() ) {
while ($post_query->have_posts()) {
$post_query->the_post();
$nav_arr = wp_get_post_terms( get_the_ID(), 'solutions_category' );
// Problem here
foreach($nav_arr as $nav_value ) {
$nav = $nav_value->name;
}
$box_tooltip = '<div>Lorem Ipsum</div>';
$info_box_title = '<h5 style="margin-bottom: 0;">' . strtoupper($post->post_title) . '</h5>';
if (!($master_array[$nav])) {
$master_array[$nav] = array();
array_push(
$master_array[$nav],
[
'icon_title' => $info_box_title,
'tooltip' => $box_tooltip,
]
);
} else {
array_push(
$master_array[$nav],
[
'icon_title' => $info_box_title,
'tooltip' => $box_tooltip,
]
);
}
} // End of while have_posts
wp_reset_postdata();
/* Foreach master array */
foreach ((array)$master_array as $master_key => $master_value) {
/* Navigation */
$navigation .= '<div>'. $master_key .'</div>';
foreach($master_value as $query_key => $query_value) {
$output_inner = '';
foreach ($query_value as $object_key => $object_value) {
$output_inner .= $object_value;
}
/* Content */
$output_outer .= '<div class="'. $master_key .'">'. $output_inner .'</div>';
} // end foreach mastervalue
} // end foreach master
} // end if have posts
return '
<div style="margin-bottom: 30px;">'. $navigation .'</div>
<div>'. $output_outer .'</div>
';
}
add_shortcode('cpt_filter', 'filter_shortcode');
输出:
问题是,如果 post 有多个类别,则该函数将只输出一次 post。例如,“GOOGLE WORKSPACE”有两个类别——“协作”和“交流”,但它只输出一次。
如何输出“GOOGLE WORKSPACE”与其拥有的类别数量一样多,并指定它自己的类别类?
迭代后“GOOGLE WORKSPACE”上的var_dump($nav_arr) :array(2) { [0]=> object(WP_Term)#3992 (10) { ["term_id"]=> int(825) ["name"]=> string(13) "Collaboration" ["slug"]=> string(13) "collaboration" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(825) ["taxonomy"]=> string(18) "solutions_category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(8) ["filter"]=> string(3) "raw" } [1]=> object(WP_Term)#3986 (10) { ["term_id"]=> int(824) ["name"]=> string(13) "Communication" ["slug"]=> string(13) "communication" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(824) ["taxonomy"]=> string(18) "solutions_category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(8) ["filter"]=> string(3) "raw" } }
试图检查是否$nav_arr
有多个值if (sizeof($nav_arr) > 1) { .... }
并创建单独的数组,但卡住了。
解决方案
问题似乎出在以下 foreach 语句中:
foreach($nav_arr as $nav_value ) {
$nav = $nav_value->name;
}
您正在遍历数组一次,并将 $nav 的值设置为“Collaboration”,然后当您第二次遍历它时(因为 $nav_arr 中有两个项目),您只是将 $nav 重写为"Communication" 的新值,最后只有一个 $nav。
$nav 应该保存为一个值数组,而不是单个值的字符串,如下所示:
foreach($nav_arr as $nav_value){
$nav[] = $nav_value;
}
没有看到完整的代码,我很难理解发生了什么......但我认为你可以替换所有:
if (!($master_array[$nav])) {
$master_array[$nav] = array();
array_push(
$master_array[$nav],
[
'icon_title' => $info_box_title,
'tooltip' => $box_tooltip,
]
);
} else {
array_push(
$master_array[$nav],
[
'icon_title' => $info_box_title,
'tooltip' => $box_tooltip,
]
);
}
}
具有以下内容:
foreach($nav as $navitem){
$master_array[$nav] = array(
'icon_title' => $info_box_title,
'tool_tip' => $box_tooltip
),
}
推荐阅读
- windows - Windows 在 destop 上使用鼠标指针变慢
- python - 将 int 添加到 Python 字典现有键而不覆盖所述键
- java - Apache Poi excel日期单元格:日期过滤器不适用于xlsx文件(必须调用Excels text to columns函数)
- bash - 在管道作业中使用 bash 获取 jenkins 用户列表
- laravel - Laravel-8 Livewire-2 在通过电线传递数据时被黑客入侵:点击
- javascript - 开玩笑:“找不到 react-redux 上下文值;请确保组件包装在
" - r - 根据条件合并R中的行和值
- node.js - 如何使用nodejs在url参数中获取日期
- python - Fastapi 在浏览器中访问 URL 时返回 404
- sql - Azure SQL 数据库中的 EncryptByKey 和 EncryptByPass 使用哪种加密算法?