it-swarm.cn

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

我有一个自定义帖子类型,其中包含一个名为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);

帮帮我们....注意上面列出的代码只是我尝试的一个代码分支,而不是整个文件。


UPDATE

嘿,这确实对我有所帮助,它和我发现这个使用,这让我完成95%,但不是100%。我尝试了你的代码,我尝试了这个我正在使用的,它删除了复制品,但它后面的任何东西都不会显示嗯....

继承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();

这里是数组的输出,它复制了数组输出,因为每次在循环中调用一个新帖子时都会调用它。该页面可在此处获得:

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

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

2
Hunter Brelsford

@ Hunter Brelsford :

很高兴在LinkedIn WordPress Group 上见到你。

也许我误解了你的问题,但听起来你是只是试图摆脱数组中的重复?例如,假设你有一个数组客户端:

<?php
$clients = array(
  'Jones Construction',
  'Smith Wholesale',
  'Smith Wholesale',
  'Williams Dry Cleaning'
);

你想转换成这样的数组?

<?php
$clients = array(
  'Jones Construction',
  'Smith Wholesale',
  'Williams Dry Cleaning'
);

如果是,那是PHP问题,而不是WordPress问题,通常我们发送的东西,但无论如何,我会继续回答这里。

很容易;因为数组键在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的更好方法不需要加载比必要更多的数据请告诉我)。

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

2
MikeSchinkel