我有一种自定义帖子类型,其中包括一种自定义分类法,称为 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();

这是来自数组的输出,它复制了数组输出,因为每当循环中调用新帖子时,都会称呼它。该页面可在此处提供:

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

查看源以查看我的意思。

有帮助吗?

解决方案

你好 @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_ids过滤分类学条款列表。我使用了RAW SQL,因为WordPress不能提供通过API获取这些数据的好方法,至少我可以在短时间内找到(如果其他人通过API知道不需要加载更多数据的更好方法,请让我知道).

希望这会建议一种方法,以便您可以在示例中使用此代码?让我知道是否知道。

许可以下: CC-BY-SA归因
scroll top