it-swarm-vi.tech

Sắp xếp bài viết WordPress thông qua các giá trị trường tùy chỉnh?

Ok, vì vậy tôi đang sử dụng lớp lớp WPAlchemy để tạo bảng ghi trường tùy chỉnh trong bài viết và cho đến nay mọi thứ đã trở nên tuyệt vời ... Tuy nhiên, có một vấn đề mà tôi dường như không thể tìm ra. Tôi đang cố gắng sử dụng các giá trị trường tùy chỉnh của "ngày sự kiện" để sắp xếp các sự kiện trên mẫu trang tùy chỉnh.

Tôi đã làm theo hướng dẫn "Truy vấn dựa trên trường tùy chỉnh và được sắp xếp theo giá trị" được tìm thấy trong bộ mã để thử và thiết lập truy vấn tùy chỉnh, nhưng nó dường như không hoạt động?

Đây là mã từ mẫu trang tùy chỉnh cho trang " Sự kiện ":

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

Có vẻ như nó không chọn các khóa trường tùy chỉnh ... Lớp tôi đang sử dụng để tạo các bảng ghi tùy chỉnh này lưu trữ tất cả chúng dưới dạng một mảng, do đó tôi đã cố gắng truy cập chúng bằng cách sử dụng: _events_meta[event_date]

Có lẽ đó là vấn đề, nhưng tôi không biết cách khắc phục nếu đó là ...

Có ý kiến ​​gì không?


EDIT: Đây là một hình ảnh để bạn có thể thấy cách các trường tùy chỉnh được lưu trữ trong cơ sở dữ liệu. Hy vọng rằng điều đó sẽ giúp bạn tìm ra lý do tại sao trên trái đất _events_meta[event_date] sẽ không hoạt động trong truy vấn?

Ảnh chụp màn hình của PHPMyAdmin với một Truy vấn chèn cho cơ sở dữ liệu WordPress http://staticloader.com/phpmyadmin.png

1
Josh

Josh, hãy xem: http://farinspace.com/wpalchemy-metabox-data-st Storage-mode/ ...

Tôi nghĩ rằng tôi sẽ thay đổi cách WPAlchemy lưu trữ các giá trị theo mặc định ... làm cho chế độ EXTRACT mặc định ...

0
farinspace

Tôi cũng có một blog với các lĩnh vực tùy chỉnh liên quan đến sự kiện. Đây là truy vấn tôi đã sử dụng kết hợp với hàm 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");

Nó sẽ chọn tất cả các bài đăng có trường tùy chỉnh có tên event_date so sánh nó với ngày hiện tại (để lọc các sự kiện cũ) và sắp xếp chúng theo một trường tùy chỉnh khác gọi là event_start_date. Tôi hy vọng rằng exmaple phức tạp chỉ cho bạn, cách bạn nên sử dụng hàm query_posts () một cách chính xác.

Một lựa chọn đơn giản chỉ kiểm tra sự tồn tại của trường tùy chỉnh trông như thế này:

query_posts('meta_key=event_date'); 

ĐẶT HÀNG đơn giản theo trường tùy chỉnh trông như thế này:

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

Bạn có thể thấy nhiều ví dụ trong mô tả API của hàm query_posts () .

2
2ndkauboy

Xin chào @ Josh :

Truy vấn của bạn hoạt động tốt. Có thể là biến $events_metabox của bạn không nằm trong phạm vi và khiến mã của bạn bị lỗi (lạ là nó vẫn chạy chân trang, tại sao không biết.) hãy thử đặt nó thành toàn cầu ở đầu mẫu của bạn:

global $events_metabox

Nếu điều đó không hiệu quả, bạn sẽ phải theo dõi vấn đề theo một cách khác vì tôi không biết mã của bạn đang làm gì với $events_metabox.

Gỡ lỗi bằng cách sử dụng Loại bỏ tăng dần và print_r()

Khi bạn gặp phải một vấn đề như thế này, hãy bắt đầu lấy đi các mảnh cho đến khi bạn khắc phục được sự cố. Nếu bạn đang cố gắng xem liệu truy vấn của mình có hoạt động hay không, hãy sử dụng print_r() để kết xuất các giá trị được bọc trong các thẻ <pre> để bạn có thể thấy những gì đang xảy ra, tức là:

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

Ngoài ra, hãy sử dụng get_posts() thay vì Direct SQL

Điều đó nói rằng, tôi rất cao khuyên bạn nên thay thế truy vấn của mình bằng một cuộc gọi get_posts(). Đó là cách tốt nhất trong WordPress để luôn sử dụng API WordPress và đó là các hàm truy vấn không bao giờ sử dụng SQL trực tiếp trừ khi hoàn toàn không có cách nào xung quanh nó. Bạn nhận được nhiều lợi ích bao gồm bộ nhớ đệm tích hợp trong một số trường hợp, chúng xử lý những việc như đảm bảo chỉ các bài đăng được xuất bản được hiển thị trừ khi bạn nói khác, và nó sẽ ít bị hỏng hơn nếu chúng thay đổi cấu trúc cơ sở dữ liệu trong tương lai.

Đây là cuộc gọi get_posts() mà bạn cần thay thế truy vấn SQL được mã hóa cứng (bằng một số cảnh báo ):

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

Hoặc tương đương này làm điều tương tự chính xác:

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

hãy cẩn thận tôi đã đề cập là truy vấn của bạn không lọc ra các bản nháp không được công bố, v.v .; Tôi đoán là những gì get_posts() thực hiện nhiều hơn những gì bạn muốn.

Tài liệu Codex cho get_posts()

Tài liệu cho get_posts() có tại đây:

Nhưng thật thú vị tài liệu tốt hơn cho các đối số get_posts() nằm trên trang query_posts() mà bạn có thể cũng có thể sử dụng cho nhu cầu của mình. Tôi thích sự kiểm soát lớn hơn của get_posts() nhưng YMMV .

Dù sao, query_posts() thực sự chỉ gọi get_posts() để các đối số thực sự giống hệt nhau:

0
MikeSchinkel