カスタムフィールド値を使用してWordPress投稿を並べ替えますか?
-
16-10-2019 - |
質問
わかりました、それで私は使っています WPアルケミークラス 投稿書き込みページでカスタム フィールド書き込みパネルを作成しました。これまでのところ、すべてが順調に進んでいます...ただし、私には理解できない問題が 1 つあります。「イベント日付」のカスタムフィールド値を使用して、カスタムページテンプレート上のイベントを並べ替えようとしています。
私は指示に従いました 「カスタムフィールドに基づいて値で並べ替えられたクエリ」 コーデックスでカスタム クエリを設定しようとしているのが見つかりましたが、機能していないようです。
これは、「」のカスタム ページ テンプレートのコードです。イベント" ページ:
<?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]
おそらくそれが問題なのですが、問題がある場合はどうすればよいのかわかりません...
何か案は?
編集: これは、カスタム フィールドがデータベースにどのように保存されているかを示す画像です。それが一体なぜなのかを理解するのに役立つことを願っています _events_meta[event_date]
クエリでは機能しないのでしょうか?
WordPress データベースの挿入クエリを含む PHPMyAdmin のスクリーンショット http://staticloader.com/phpmyadmin.png
解決
ジョシュ、ご覧ください: http://farinspace.com/wpalchemy-metabox-data-storage-modes/ ...
私は、wpalchemyがデフォルトで値を保存する方法を変えると考えています...抽出モードをデフォルトにする...
他のヒント
イベントに関するカスタムフィールドを備えたブログも入手しました。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 の説明.
やあ @ジョシュ:
クエリは正常に機能します。 それはおそらくあなたのものです $events_metabox
変数はスコープではなく、コードが失敗するだけです(奇妙なことに、フッターを実行します。なぜなら、理由はDunnoです。)最初にテンプレートのトップでグローバルに設定してみてください。
global $events_metabox
それがうまくいかない場合、あなたのコードが何をしているのかわからないので、他の方法で問題を追跡する必要があります $events_metabox
.
増分除去を使用してデバッグします print_r()
このような問題に遭遇したら、問題を解決するまでピースを取り除き始めます。クエリが機能しているかどうかを確認しようとしている場合は、 print_r()
包まれた値をダンプします <pre>
何が起こっているのかを見ることができるようにタグ、つまり:
<?php
$pageposts = $wpdb->get_results($querystr, OBJECT);
echo '<pre>';
print_r($pageposts);
echo '<pre>';
また、使用してください get_posts()
直接SQLの代わりに
そうは言っても、私は 非常に クエリをaに置き換えることをお勧めします get_posts()
電話。 WordPressのベストプラクティスです 常にWordPress APIを使用し、クエリ関数です と 直接SQLを使用しないでください それを回避する方法がまったくない限り。組み込みのキャッシングなど、多くの利点があります。場合によっては、特に知らない限り、公開された投稿のみが表示されるようにするなどの利点があり、将来データベース構造を変更すると壊れる可能性が低くなります。
これが次のとおりです get_posts()
ハードコーディングされたSQLクエリを交換する必要があります( いくつかの注意事項):
$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()
したがって、議論は本当に同じです: