web-dev-qa-db-ja.com

ドロップダウンから重複するカスタム分類条件を削除する選択しますか。

私は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%ではありません。私はあなたのコードを試してみました、そして私は私が使っているものを試してみました。

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:

LinkedInの WordPressグループからお会いできて嬉しいです

私はあなたの質問を誤解しているかもしれませんが、あなたは単に配列の重複を取り除こうとしているように思えますか?例えば、あなたが配列クライアントを持っているとしましょう:

<?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を収集して分類用語のリストをフィルタリングします。 WordPressがAPIを通じてこのデータを取得するための良い方法を提供していないため、生のSQLを使用しました。少なくとも他の誰かがAPIを使用しないほうが良い方法を知っている場合はわかりません(必要以上に多くのデータをロードする必要はありません()。

うまくいけば、これはあなたの例でこのコードを使用できるようになるアプローチを示唆するでしょうか?知らなければ教えてください。

2
MikeSchinkel