it-swarm-id.com

Menyortir Posting WordPress melalui Nilai Bidang Kustom?

Oke, jadi saya menggunakan kelas WPAlchemy untuk membuat panel tulis bidang khusus pada posting tulis Halaman, dan sejauh ini semuanya berjalan baik ... Namun, ada satu masalah yang sepertinya tidak bisa saya pahami. Saya mencoba menggunakan nilai bidang khusus "tanggal acara" untuk mengurutkan acara pada templat halaman khusus.

Saya mengikuti instruksi "Permintaan berdasarkan Bidang Kustom dan Diurutkan berdasarkan Nilai" ditemukan dalam kodeks untuk mencoba dan siapkan kueri khusus, tetapi sepertinya tidak berfungsi?

Berikut kode dari templat halaman khusus untuk halaman " Acara ":

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

Sepertinya tidak mengambil kunci bidang khusus ... Kelas yang saya gunakan untuk membuat panel tulis khusus ini menyimpan semuanya sebagai array, karenanya alasan saya mencoba mengaksesnya dengan menggunakan: _events_meta[event_date]

Mungkin itu masalahnya, tapi saya tidak tahu bagaimana cara memperbaikinya jika ...

Ada ide?


EDIT: Berikut adalah gambar sehingga Anda dapat melihat bagaimana bidang khusus disimpan dalam database. Semoga itu membantu Anda mengetahui mengapa _events_meta[event_date] tidak dapat bekerja dalam kueri?

Cuplikan layar PHPMyAdmin dengan Insert Query untuk database WordPress http://staticloader.com/phpmyadmin.png

1
Josh

Josh, lihat di: http://farinspace.com/wpalchemy-metabox-data-storage-modes/ ...

Saya berpikir saya akan mengubah cara WPAlchemy menyimpan nilai secara default ... menjadikan mode EXTRACT default ...

0
farinspace

Saya juga punya blog dengan bidang khusus tentang acara. Berikut adalah kueri yang saya gunakan dalam kombinasi dengan fungsi 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");

Ini akan memilih semua posting dengan bidang khusus bernama event_date membandingkannya dengan tanggal saat ini (untuk menyaring acara lama) dan mengurutkannya dengan bidang khusus lain yang disebut event_start_date. Saya harap exmaple yang kompleks menunjukkan kepada Anda, bagaimana Anda harus menggunakan fungsi query_posts () dengan benar.

Pilihan sederhana yang menguji hanya untuk keberadaan bidang khusus terlihat seperti ini:

query_posts('meta_key=event_date'); 

PESANAN sederhana DENGAN bidang kustom terlihat seperti ini:

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

Anda dapat melihat banyak contoh di deskripsi API dari fungsi query_posts () .

2
2ndkauboy

Hai @ Josh :

Permintaan Anda berfungsi dengan baik. Mungkin saja variabel $events_metabox Anda tidak berada dalam cakupan dan menyebabkan kode Anda gagal (anehnya ia masih menjalankan footer, tidak tahu mengapa.) Untuk memperbaikinya terlebih dahulu coba atur ke global di bagian atas template Anda:

global $events_metabox

Jika itu tidak berhasil, Anda harus melacak masalahnya dengan cara lain karena saya tidak tahu apa yang kode Anda lakukan dengan $events_metabox.

Debug Menggunakan Incremental Removal dan print_r()

Ketika Anda mengalami masalah seperti ini mulai mengambil potongan sampai Anda memperbaiki masalahnya. Jika Anda mencoba untuk melihat apakah permintaan Anda berfungsi atau tidak, gunakan print_r() untuk membuang nilai yang dibungkus dengan tag <pre> sehingga Anda dapat melihat apa yang terjadi, yaitu:

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

Juga, Gunakan get_posts() alih-alih Direct SQL

Yang mengatakan, saya sangat merekomendasikan Anda mengganti permintaan Anda dengan panggilan get_posts(). Ini adalah praktik terbaik di WordPress untuk selalu menggunakan API WordPress dan fungsi kueri dan tidak pernah menggunakan SQL langsung kecuali sama sekali tidak ada cara di sekitarnya. Anda mendapatkan banyak manfaat termasuk built-in caching dalam beberapa kasus, mereka menangani hal-hal seperti memastikan hanya posting yang dipublikasikan ditampilkan kecuali jika Anda memberi tahu sebaliknya, dan kecil kemungkinannya akan pecah jika mereka mengubah struktur database di masa depan.

Inilah panggilan get_posts() yang harus Anda ganti permintaan SQL hardcoded Anda (dengan beberapa peringatan ):

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

Atau ini setara melakukan hal yang sama persis:

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

Peringatan yang saya sebutkan adalah bahwa permintaan Anda tidak memfilter yang tidak dipublikasikan, konsep, dll .; Dugaan saya adalah apa yang get_posts() lakukan sebenarnya lebih dari yang Anda inginkan.

Codex Documents untuk get_posts()

Dokumentasi untuk get_posts() ada di sini:

Namun yang menarik dokumentasi yang lebih baik untuk argumen get_posts() ada pada halaman query_posts() yang mungkin bisa Anda gunakan untuk kebutuhan Anda. Saya lebih suka kontrol yang lebih besar dari get_posts() tetapi YMMV .

Bagaimanapun, query_posts() sebenarnya hanya memanggil get_posts() sehingga argumennya benar-benar identik:

0
MikeSchinkel