web-dev-qa-db-ja.com

カスタムフィールド値を介してWordPress投稿をソートしますか?

わかりましたので、私は WPAlchemy class を使用して、書き込み投稿ページにカスタムフィールド書き込みパネルを作成しています。すべてがうまくいきました...しかし、私が理解できないと思われる問題が1つあります。 「イベントの日付」のカスタムフィールド値を使用して、カスタムページテンプレートのイベントを並べ替えようとしています。

指示に従いました "カスタムフィールドに基づいたクエリと値で並べ替え" カスタムクエリを試行してセットアップするためにコーデックスで見つかりましたが、動作しているように見える?

Events」ページのカスタムページテンプレートのコードは次のとおりです。

<?php
/* 
  Template Name: Events
*/
get_header();
?>
<div id="depthead" class="grid_12">
  <h2>Upcoming Events</h2>
</div><!--/depthead-->
<?php

$querystr = "
  SELECT wposts.* 
  FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
  WHERE wposts.ID = wpostmeta.post_id 
  AND wpostmeta.meta_key = '_events_meta[event_date]' 
  AND wposts.post_type = 'post'

  ORDER BY wpostmeta.meta_value DESC
";
$pageposts = $wpdb->get_results($querystr, OBJECT);

?>
<?php if ($pageposts): global $post; $cnt=0; foreach ($pageposts as $post): $cnt++; setup_postdata($post); ?>
<div id="article-<?php echo get_the_ID(); ?>" class="listingbox grid_3">
  <div class="deptpostimg">
    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><img src="<?php echo $events_metabox->get_the_value('event_thumbnail'); ?>" style="outline:1px solid #000" alt="<?php the_title_attribute(); ?>" /><span class="event-date"><?php $events_metabox->the_value('event_date'); ?></span></a>
  </div><!--/deptpostimg-->
  <h4 class="listing-titles"><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h4>
  <div class="excerpt">
    <?php the_excerpt(); ?>
  </div><!--/excerpt-->
</div><!--/article-<?php echo get_the_ID(); ?>-->
<?php if($cnt % 4 == 0) { ?>
<div class="grid_12 rowseparator">
  <hr />
</div><!--/rowseparator-->
<?php } ?>
<?php endforeach; endif; ?>
</div><!--/wrapper-->
<?php get_footer(); ?>

カスタムフィールドキーを取得していないようです...これらのカスタム書き込みパネルを作成するために使用しているクラスは、それらをすべて配列として格納しているため、_events_meta[event_date]を使用してそれらにアクセスしようとしました。

たぶんそれが問題なのかもしれませんが、もしそうならそれを修正する方法がわかりません...

何か案は?


EDIT:以下に画像を示します。カスタムフィールドがデータベースにどのように保存されているかを確認できます。できれば、なぜ_events_meta[event_date]がクエリで機能しないのかを理解できますか?

WordPressデータベースの挿入クエリを使用したPHPMyAdminのスクリーンショットhttp://staticloader.com/phpmyadmin.png

1
Josh

ジョシュ、見てみましょう: http://farinspace.com/wpalchemy-metabox-data-storage-modes/ ...

WPAlchemyがデフォルトで値を格納する方法を変更することを考えています... EXTRACTモードをデフォルトにする...

0
farinspace

イベントに関するカスタムフィールドのあるブログもあります。これは私がquery_posts()関数と組み合わせて使用​​したクエリです。

query_posts($query_string . "&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')."&meta_key=event_date_start&orderby=meta_value&order=ASC");

Event_dateという名前のカスタムフィールドですべての投稿を選択し、現在の日付と比較して(古いイベントを除外する)、event_start_dateという名前の別のカスタムフィールドで並べ替えます。複雑な例で、query_posts()関数を正しく使用する方法がわかります。

カスタムフィールドの存在のみをテストする単純な選択は、次のようになります。

query_posts('meta_key=event_date'); 

カスタムフィールドによる単純なORDER BYは、次のようになります。

query_posts('meta_key=event_date&orderby=meta_value&order=ASC');

Query_posts()関数の APIの説明 に多くの例があります。

2
2ndkauboy

こんにちは @Josh

あなたの問い合わせはうまくいきます。 おそらくあなたの$events_metabox変数が有効範​​囲になく、コードが失敗するだけです(奇妙なことにまだフッタを実行しています、理由はありません)。

global $events_metabox

それでもうまくいかない場合は、コードが$events_metaboxで何をしているのかわからないので、他の方法で問題を突き止める必要があります。

増分削除とprint_r()を使用したデバッグ

このような問題に遭遇したとき、あなたが問題を解決するまで断片を取り除き始めます。クエリが機能しているかどうかを調べようとしている場合は、print_r()を使用して<pre>タグで囲まれた値をダンプします。

<?php
$pageposts = $wpdb->get_results($querystr, OBJECT);
echo '<pre>';
print_r($pageposts);
echo '<pre>';

また、Direct SQLの代わりにget_posts()を使用する

とは言っても、私は高度にあなたのクエリをget_posts()呼び出しに置き換えることをお勧めします。これはWordPressのベストプラクティスであり、 常にWordPress APIを使用すること、およびクエリ関数 および 直接SQLを使用しないこと それを回避する方法がまったくない場合を除きます。場合によっては組み込みキャッシュを含む多くの利点があります。そうでない場合は、パブリッシュされた投稿のみを表示するように処理します。将来データベース構造が変更された場合に破損する可能性は低くなります。

ハードコードされたSQLクエリを置き換える必要があるget_posts()呼び出しは次のとおりです(いくつかの注意事項があります)。

$pageposts = get_posts('meta_key=_events_meta[event_date]&orderby=meta_value&order=ASC');

あるいは、これと同等のものがまったく同じことをします。

$pageposts = get_posts(array(
  'meta_key' => '_events_meta[event_date]',
  'orderby'  => 'meta_value',
  'order'    => 'ASC',
));

私が述べた警告はあなたの質問が未発表の草稿などを除外しなかったということです。とにかくget_posts()が実際にもっと多くのことをしてくれると思います。

get_posts()のコーデックスドキュメント

get_posts()のドキュメントはこちらです。

しかし興味深いことにget_posts()引数に関するより良いドキュメントはquery_posts()ページにあります あなたのニーズに合わせておそらく使うことができます。私はget_posts()のより良いコントロールを好みますが YMMV

とにかく、query_posts()は実際にはget_posts()を呼び出すだけなので、引数は本当に同じです。

0
MikeSchinkel