从下拉列表中删除重复的自定义分类条款?
-
16-10-2019 - |
题
我有一种自定义帖子类型,其中包括一种自定义分类法,称为 client_name
. 。有一个页面可以加载这些自定义帖子类型并显示它们。我需要开发的是一个下拉列表,它显示了我所做的所有自定义帖子的自定义分类法,但是我需要删除重复项,并按字母顺序排列它们,这是我遇到问题的地方。
这是我试图删除重复项的方法(它不起作用):
<?php
<form method="post" id="clientform" action="" onsubmit="return getURL(this.url.value)">
<select name="url" id="client">
<option selected="selected">By Client</option>
<?php
$args=array(
'post_type' => 'our_work',
'post_status' => 'publish',
'order' => 'ASC',
'posts_per_page' => -1
);
$my_query = new WP_Query($args);
$k=0;
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post();
$termArray[$k] = array (trim(get_the_term_list( $post->ID, 'client_name')));
// $text = trim(get_the_term_list( $post->ID, 'client_name'));
for ($i = 0; $i <= $termArray.count; $i++ ) {
for ($j = 0; $j <= $tempArray.count; $j++) {
if ($tempArray[$i] == $tempArray[$j]) {
unset($tempArray[$k]);
$termArray = array_values($termArray);
}
} // end of for
$k++;
?><option value="<?php bloginfo('url'); echo "/client_name/"; echo $termArray[$k]; ?>"><?php echo $termArray[$k]; ?></option><?php
} ?>
<?php
endwhile;
}
wp_reset_query();
?>
</select>
<input type="submit" id="clientsubmit" value="Search" />
</form>
好的,现在我前几天遇到了这个PHP功能,它可以做我想要的,我只是不知道如何正确使用它。
array_unique($input);
帮助我出去。...注意上面列出的代码只是我尝试的一个代码分支,而不是整个文件。
更新
嘿,这确实对我有很大的帮助,我发现这可以使用,这使我完成了95%的完成,但还没有100%。我尝试了您的代码,然后尝试了我正在使用的代码,它可以删除DUP的代码,但是在它后就不会显示hmm。
这是WP代码:
<?php
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post();
$termArray[$i] = trim(get_the_term_list( $post->ID, 'client_name'));
$termArray = array_unique($termArray);
$termArray = array_values($termArray);
print_r($termArray);
print_r(sizeof($termArray));
if ($termArray[$i] != '') {
?><option value="<?php bloginfo('url'); echo "/client_name/"; echo $termArray[$i]; ?>"><?php echo $termArray[$i]; ?></option><?php
}// end of if $i++;
endwhile;
}
wp_reset_query();
这是来自数组的输出,它复制了数组输出,因为每当循环中调用新帖子时,都会称呼它。该页面可在此处提供:
查看源以查看我的意思。
解决方案
你好 @Hunter Brelsford:
很高兴从这里见到你 LinkedIn上的WordPress组.
也许我误解了您的问题,但听起来好像您是 只是试图摆脱数组中的DUP? 例如,假设您有一个数组客户端:
<?php
$clients = array(
'Jones Construction',
'Smith Wholesale',
'Smith Wholesale',
'Williams Dry Cleaning'
);
您想转换为这样的数组吗?
<?php
$clients = array(
'Jones Construction',
'Smith Wholesale',
'Williams Dry Cleaning'
);
(如果是,那是一个PHP问题,而不是WordPress问题,通常是某物 我们寄出, ,但无论如何我都会继续回答。)
轻松;由于Array键在PHP中是唯一的,只需翻转数组(用键交换值),然后返回数组键,您将拥有独特的数组,例如:
<?php
$clients = array(
'Jones Construction',
'Smith Wholesale',
'Smith Wholesale',
'Williams Dry Cleaning'
);
print_r(array_keys(array_flip($clients)));
该代码打印:
Array
(
[0] => Jones Construction
[1] => Smith Wholesale
[2] => Williams Dry Cleaning
)
那是你追求的吗?
更新:
你好 @Hunter Brelsford:
我正在回应您的更新。好的,为什么我们不尝试以不同的方式解决这个问题?这是一个独立的示例,您可以将网站的根部复制为 test.php
然后将其运行为 http://magicvideo.com/test.php
看到它起作用:
<?php
include "wp-load.php";
header('Content-Type:text/plain');
global $wpdb;
$sql = <<<SQL
SELECT DISTINCT
tt.term_id
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE 1=1
AND p.post_status='publish'
AND p.post_type='our_work'
AND tt.taxonomy='client_name'
SQL;
$terms = $wpdb->get_results($sql);
$term_ids = array();
foreach($terms as $term) {
$term_ids[] = $term->term_id;
}
$terms = get_terms('client_name',array(
'include'=> implode(',',$term_ids),
));
print_r($terms);
我们使用RAW SQL查询 taxonomy='client_name'
为了 'post_type='our_work'
然后我们收集 $term->term_id
s过滤分类学条款列表。我使用了RAW SQL,因为WordPress不能提供通过API获取这些数据的好方法,至少我可以在短时间内找到(如果其他人通过API知道不需要加载更多数据的更好方法,请让我知道).
希望这会建议一种方法,以便您可以在示例中使用此代码?让我知道是否知道。