2012-04-10 3 views
0

私はディレクトリのスタッフリストに取り組んでいます。この目的のためのプラグインは、私が探していたものにはあまりにも複雑すぎたり、シンプルすぎたりしたので、私はカスタムソリューションに行きました。 私はこのカスタムポストタイプ "staff"を作成してカスタム分類を付けて(Science、Mathematics、Administrationなど)作成しましたので、テーブルにリストされたすべての投稿を取得するクエリがあります。カスタムフィールドの最初の文字によるクエリのフィルタリング - Wordpress

<table class="directorytable"> 
    <thead> 
     <th class="first-th">Portrait</th> 
     <th>Name</th> 
     <th>Position</th> 
     <th>Phone</th> 
     <th style="width:60px !important;text-align:center;">Email&nbsp;&nbsp;&nbsp;&nbsp;</th> 
     <th style="width:60px !important;text-align:center;">Website&nbsp;&nbsp;</th> 
     <th style="width:60px !important;text-align:center;">Details&nbsp;&nbsp;</th> 
    </thead> 
<?php query_posts(array('post_type'=>'staff','orderby'=>'meta_value','meta_key'=>'staff_last_name','order'=>'asc'))?> 
<?php while(have_posts()): the_post();?> 

<tr> 
    <td class="first-td"><a rel="lightbox" href="<?php the_permalink(); ?>"/><img src="<?php the_field('staff_portrait');?>" style="border-radius:2px; width:35px;"/></a></td> 
<td><a rel="lightbox[1]" href="<?php the_permalink();?>"><?php the_field('staff_name');?> <?php the_field('staff_last_name');?></a> </td> 
<td><?php the_field('staff_position'); ?></td> 
<td><?php the_field('staff_phone');?> | <strong>Ext: </strong><?php the_field('staff_extension')?></td> 
<td style="width:60px; text-align:center;"><a href="mailto:<?php the_field('staff_email');?>"><img src="/images/directory/mail.png"/></a></td> 
<td style="width:60px; text-align:center;"><?php if(get_post_meta($post->ID,'staff_website', true)){?><a target="_blank" href="<?php the_field('staff_website');?>"><img src="/images/directory/document-globe.png"/></a><?php } else {?><?php echo '';?><?php } ?></td> 
<td style="width:60px; text-align:center;"><a rel="lightbox[2]" href="<?php the_permalink();?>"><img src="/images/directory/magnifier-zoom.png"/></a></td> 
</tr> 
<?php endwhile; ?> 
</table> 

このリストは非常にうまく機能していますが、クライアントからアルファベットインデックスを追加するように依頼されました。結果が出る前にリストされた範囲が必要になり、クリックすると、 "staff_last_name"カスタムフィールド(私はACFを使用しています)が選択された文字で始まる投稿のみが表示されます。

私はAZIndex、WP-Snapなどのプラグインで試してみましたが、私のために働いたものはありませんでした。

私はこの問題について推奨/解決を感謝したいと思います。

答えて

1

あなたは最初に検索しているとします(つまり、OKをリンクして値を取得すると、$_GETなど)、またはthis exampleのようにquery_varを追加したとします。

有効な値があることを確認したことを前提としています(たとえば、アルファベットの1文字など)。残念ながら、それは$initialを見つけるのに値は、(詳細はthe WordPress codexを参照)、$initialという変数に格納されて

<?php query_posts (
     array(
      'post_type'=> 'staff', 
      'orderby' => 'meta_value', 
      'meta_key' => 'staff_last_name', 
      'order' => 'asc', 
      'meta_query' => array(
       array(
        'key' => 'staff_last_name', 
        'value' => $initial, 
        'compare' => 'LIKE' 
       ) 
      ) 
     ) 
    ); 
?> 

ような何かにあなたのクエリを変更すると、あなたが必要なもののほとんどが生成されますと仮定

姓のどこにでも。クエリの大文字と小文字が区別され、最初の文字(および$initial)のみが大文字である場合は、問題ではありません。あなたが必要として、それが動作しない場合は

、私は3つのオプションを考えることができます:

  1. 利用代わりに「LIKE」の「BETWEEN」、そしてあなたが探している手紙の値を渡すと、 1つ後(ASCII値でインクリメント)
  2. 上記のクエリを使用してget_meta_sqlフィルタを追加し、引数の「%」を「 '」に置き換えます。「A」の名前を検索する場合は、「A、B」を渡します。クエリに他のLIKE条件があると、予期しない副作用が発生する可能性があります。
  3. posts_whereフィルタを追加して、必要なSQLを自分で追加してください。
+0

こんにちはホボ、すごくお世話してくれてありがとうございました...悲しいことに私はそれを100%理解できないと言わなければなりません。私はyeyがテーブルの上に示したいインデックスA-Zを生成しなかった。あなたの説明の背後にある考え方は、文字が押されたときに新しいクエリを生成することです。私は正直言って、これをどう扱うかという考えは一切ないので、私は何も定義しなかった。申し訳ありません、もう一度、ありがとうございます。 – Jaypee

+0

BETWEENを使って、検索された文字を引っ張り、次の値のためにそれを増やした配列を作成して、メタフィールドの最初の文字で「投稿」を完全に検索しました。ありがとう – philhoyt

関連する問題