从下拉列表中删除重复的自定义分类术语?

时间:2010-09-01 作者:Hunter Brelsford

我有一个自定义的帖子类型,其中包括一个自定义的分类法,名为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,但之后的任何内容都不会显示,嗯。。。。

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();
这是数组的输出,它复制了数组的输出,因为每次在循环中调用新的post时都会调用它。该页面可在以下位置获得:

http://magicvideo.com/cms/work/

查看来源以了解我的意思。

1 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

你好@Hunter Brelsford:

很高兴在这里看到你WordPress Group on LinkedIn.

也许我误解了你的问题,但听起来你是simply trying to get rid of dups in an array? 例如,假设您有一个阵列客户端:

<?php
$clients = array(
  \'Jones Construction\',
  \'Smith Wholesale\',
  \'Smith Wholesale\',
  \'Williams Dry Cleaning\'
);
你想转换成这样的数组吗?

<?php
$clients = array(
  \'Jones Construction\',
  \'Smith Wholesale\',
  \'Williams Dry Cleaning\'
);
如果是,那是一个PHP问题,而不是WordPress问题,通常是we send away, 但我还是会在这里回答你

这很容易;由于数组键在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);
我们使用原始SQL查询taxonomy=\'client_name\' 对于\'post_type=\'our_work\' 然后我们收集$term->term_ids来筛选分类术语列表。我使用原始SQL是因为WordPress没有提供一种通过API获取数据的好方法,至少我在短时间内找不到这种方法(如果其他人知道通过API的更好方法,不需要加载太多数据,请告诉我)。

希望这将提供一种方法,以便您能够在示例中使用此代码?如果不知道,请告诉我。

结束

相关推荐