2013-12-10 20 views
6

Tôi muốn tạo trang để lọc bài đăng dựa trên một số tiêu chí.Cho phép người dùng sắp xếp các bài đăng trong Wordpress

Tôi có thể làm việc với wp_query và gửi bài đăng khá dễ dàng, vấn đề của tôi là tôi không thể tìm ra (cũng không tìm thấy câu trả lời trực tuyến về điều này, tin tôi đi) cách cho phép người dùng làm điều này.

Lấy ví dụ này, trả về các bài đăng theo thứ tự giá (giá trị meta trường tùy chỉnh) từ cao nhất đến thấp nhất với 33 bài đăng.

<?php 

$featuredPosts = new WP_Query(array(
'posts_per_page' => 33, 
    'meta_key'=>'Price', 
    'orderby' => 'meta_value_num', 
    'order' => DESC 
)); 

?> 

<?php if ($featuredPosts->have_posts()) : ?> 

<?php while ($featuredPosts->have_posts()) : $featuredPosts->the_post(); ?> 

<article <?php post_class('item-post block'); ?> id="post-<?php the_ID(); ?>"> 
<h2 class="price-title"><?php the_title(); ?> </h2> 

</article> <!-- end div post --> 

<?php endwhile; wp_reset_query(); ?> 

<?php endif; ?> 

Bây giờ, ngay cả sau khi đọc và googling, tôi sẽ bị nguyền rủa nếu tôi biết cách triển khai điều này ở mặt trước để người dùng lọc bài đăng.

Ý tôi là, tôi biết bạn có thể thêm vào URL trong Wordpress để thay đổi thứ tự các bài đăng, nhưng trong ngữ cảnh này, tôi hoàn toàn bị mất.

Tôi đã thử cách này nhưng không hoạt động.

<?php 

$by_price = esc_url(add_query_arg(array(
    'meta_key' => 'price', 
    'orderby' => 'meta_value_num', 
    'order' => ASC 
))); 
$by_date = esc_url(add_query_arg(array(
    'orderby' => 'date', 
    'order' => DESC 
))); 

?> 

<ul> 
    <li><a href="<?php echo $by_price;?>">Order by price</a></li> 
    <li><a href="<?php echo $by_date;?>">Order by date</a></li> 
</ul> 

Những gì tôi đang cố gắng để đạt được là thực sự khá đơn giản là tốt, cho phép người dùng chọn thể loại, chọn phạm vi giá (đoán tôi muốn viết một cái gì đó trong JQuery để cung cấp một giá trị vào một lĩnh vực), thiết lập số lượng kết quả mà họ muốn được trả lại.

Tôi đã thử googling mọi thứ dưới ánh mặt trời Tôi có thể nghĩ về điều này, không có súc sắc.

Trả lời

0

OK, tôi cập nhật mã để làm cho nó rõ ràng:

--- Tôi không nghĩ meta_key sẽ được tự động đón ---

functions.php

... 

    $whitList = array(
     'price' => array(
     'posts_per_page' => 33, 
     'meta_key'=>'price', 
     'orderby'=>'meta_value_num', 
     'order' => ASC 
     ), 
     'date' => array(
     'posts_per_page' => 33, 
     'orderby'=>'date', 
     'order' => DESC 
     ) 
    ); 
... 

của bạn vòng đầu tiên php:

<?php 

gloabl $whitList; //to use the $whitList in your functions.php. 

$aryQuery = $whitList[$_REQUEST['orderby']] ? $whitList[$_REQUEST['orderby']] : $whitList['price']; 

$featuredPosts = new WP_Query($aryQuery); 

.... 
.... 
?> 

Cho trang danh sách của bạn:

<ul> 
<?php 
    gloabl $whitList; //to use the $whitList in your functions.php. 
    foreach($whitList as $orderby => $aryOrderBySettings){ 
     ?> 
     <li> <a href="<?php echo esc_url(add_query_arg('orderby', $orderby));?>">Order by <?php echo $orderby;?></a></li> 
     <?php 
    } 
?> 
</ul> 
+0

Phần thứ hai có cần nằm trong vòng lặp không? – andy

+0

Không, không phải trong vòng lặp – Zac

+0

Trừ khi tôi đặt phần thứ hai bên trong vòng lặp từ phần đầu tiên nó không bao giờ xuất hiện trên trang. – andy

3

Hãy thử Simple Custom Post Order plugin.

Đang sử dụng AJAX và JavaScript, bạn không phải tải bất cứ thứ gì khác. Bạn phải chỉ cần kéo và thả các bài viết.

+0

Điều này dành cho lọc phụ trợ chứ không phải những gì OP muốn. – phpheini

0

Sử dụng thông số $_GET là cách để truy cập tại đây. Trước hết, bạn sẽ muốn cho phép khách truy cập của bạn truy cập vào các biến này. Cách tiếp cận liên kết là tốt, tổng thể, vì vậy chúng tôi có thể tạo ra các liên kết tăng cường bằng cách sử dụng các add_query_arg để tack vào các tham số thêm vào URL hiện tại.

<?php 
    $urla = add_query_arg('sort' => 'price', 'asc' => '1'); 
    $urld = add_query_arg('sort' => 'price', 'asc' => '0'); 
?> 
<a href="<?php echo esc_url($url); ?>">Sort by price (asc)</a> 
<a href="<?php echo esc_url($url); ?>">Sort by price (desc)</a> 

Khi nhấn vào, các tacked trên các biến như vậy có thể được phát hiện:

<?php 
    // Get an allowed sort variable and the order 
    $sort = isset($_GET['sort']) && in_array($_GET['sort'], array('price'))) 
      ? $_GET['sort'] : null; 
    $order = isset($_GET['asc']) && $_GET['asc'] == '0' ? 'DESC' : 'ASC'; 
?> 

Bây giờ bạn sẽ làm tăng thêm truy vấn chính của bạn với dữ liệu bạn vừa lấy ra. Nếu bạn đang sử dụng cách mặc định truy vấn bài đăng trên một trang, bạn sẽ có thể lấy đi với query_posts, mặc dù nó là not recomended.Và, nếu bạn đang sử dụng vòng lặp tùy chỉnh, chỉ cần đưa các đối số mới vào đó:

<?php 
    $args = array(); 
    switch ($sort): 
     case 'price': 
      $args['order'] = $order; 
      $args['orderby'] = 'meta_value_num'; 
      $args['meta_key'] = 'price'; 
      break; 
     default: 
      break; 
    endswitch; 

    $defaults = array('posts_per_page' => 33); 
    $query = new WP_Query(wp_parse_args($args, $defaults)); 
?> 

Bạn có thể thêm các biến khác, bằng cách tạo thêm URL và nút để nhấn và nhiều trường hợp hơn trong lệnh chuyển đổi để mở rộng ví dụ cơ bản ở trên.

Đoạn mã đầu tiên sẽ chuyển đến bất cứ nơi nào bạn muốn các nút xuất hiện. Đoạn mã thứ hai đi trước phần thứ ba, đi trước khi xuất kết quả.

Các vấn đề liên quan