it-swarm-pt.tech

Removendo os termos de taxonomia personalizados duplicados de dentro de uma seleção suspensa?

Eu tenho um tipo de postagem personalizada que inclui uma taxonomia personalizada, chamada client_name. Há uma página que carrega esses tipos de postagem personalizados e os exibe. O que preciso desenvolver é uma lista suspensa que exibe toda a taxonomia personalizada dessas postagens personalizadas, o que eu fiz, mas preciso remover duplicatas e organizá-las em ordem alfabética, que é onde estou tendo problemas.

É isso que estou tentando remover duplicatas (não funciona):

<?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>

Ok, agora eu corri através desta função PHP no outro dia e faz o que eu quero, eu só não sei como usá-lo corretamente.

array_unique($input);

Ajude-me a sair pessoal ... Note que o código listado acima é apenas um ramo de código que eu estava tentando, não o arquivo inteiro.


ATUALIZAR

Ei isso me ajuda um pouco, e achei isso para usar, isso me faz 95% pronto, mas não 100% ainda. Eu tentei o seu código, e eu tentei este que eu estou usando, e ele remove o dup, mas qualquer coisa que vem depois que ele não exibirá hmm ....

Aqui está o código 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();

E aqui está a saída da matriz, que duplica a saída da matriz porque é chamada toda vez que uma nova postagem é chamada dentro do loop. A página está disponível aqui:

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

Ver a fonte para ver o que eu quero dizer.

2
Hunter Brelsford

Oi @ Hunter Brelsford:

É bom vê-lo aqui no WordPress Group no LinkedIn .

Talvez eu entenda mal sua pergunta, mas parece que você está simplesmente tentando se livrar de dups em uma matriz? Por exemplo, digamos que você tenha uma matriz de clientes:

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

E você quer converter para uma matriz como esta?

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

( Se sim, é uma questão PHP e não uma questão do WordPress, normalmente algo que enviamos , mas eu ' Eu vou em frente e respondo aqui de qualquer maneira.

É fácil; já que as chaves do array são únicas em PHP basta inverter o array (trocar os valores com suas chaves) e então retornar as chaves do array e você terá seu array único, assim:

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

Esse código imprime:

Array
(
    [0] => Jones Construction
    [1] => Smith Wholesale
    [2] => Williams Dry Cleaning
)

Foi isso que você estava depois?

ATUALIZAR:

Oi @ Hunter Brelsford :

Estou respondendo a sua atualização. Ok, por que não tentamos lidar com isso de uma maneira diferente? Aqui está um exemplo autônomo que você pode copiar para a raiz do seu site como test.php e depois executá-lo como http://magicvideo.com/test.php para ver se funciona:

<?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);

Usamos o SQL bruto para consultar os termos no taxonomy='client_name' para 'post_type='our_work' e, em seguida, coletamos o $term->term_ids para filtrar a lista de termos da taxonomia. Eu usei SQL bruto porque o WordPress não fornece uma boa maneira de obter esses dados através de uma API, pelo menos não que eu poderia encontrar no curto prazo ( se alguém sabe de uma maneira melhor através da API que doesn não é necessário carregar muito mais dados do que o necessário, por favor me avise ).

Espero que isso sugira uma abordagem para que você possa usar esse código em seu exemplo. Deixe-me saber se sei se não.

2
MikeSchinkel