Результаты поиска в Wordpress - PullRequest
0 голосов
/ 25 января 2012

Не знаю, что я здесь делаю неправильно.

У меня есть рабочая функция поиска для поиска свойств, которую я могу использовать для поиска в пользовательских полях.Я хочу упорядочить результаты поиска по цене asc и desc, используя выпадающий фильтр вверху результатов поиска.

У меня есть файл search.php, в который я поместил этот код:

    <?php include (TEMPLATEPATH . '/search-query.php'); ?>
<form name="formorder" method="post">
    <select name="resultsorder" onChange="formorder.submit();">
        <option>Order Results By</option>
        <option value="Price High-Low" <?php echo ($resultsorder == 'Price High-Low')? 'selected="selected"':''; ?>>Price Low-High</option>
        <option value="Price High-Low" <?php echo ($resultsorder == 'Price High-Low')? 'selected="selected"':''; ?>>Price High-Low</option>
        <option value="a-z" <?php echo ($resultsorder == 'a-z')? 'selected="selected"':''; ?>>a-z</option>

    </select>
    </form>

    And I have a search-query.php containing this code:

    <?php if($resultsorder) {
    //get value from order dropdown on search results page
    $resultsorder = $resultsorder;
    } else {
    $resultsorder = get_option('wp_searchorder');}

    switch ($resultsorder) {
    case "Price High-Low":
        $metakey = 'price';
        $order = 'DESC';
        $orderby = 'meta_value_num';
        break;
    case "Price Low-High":
        $metakey = 'price';
        $order = 'ASC';
        $orderby = 'meta_value_num';
        break;
    case "a-z":
        $metakey = 'address';
        $order = 'ASC';
        $orderby = 'meta_value';
        break;}


    if (!empty($_ids) && !$alllistings) {

    $wpq = array ('post_type' => 'listing', 'meta_key' => $metakey, 'orderby' =>       $orderby, 'order' => $order, 'post__in' => $_ids,  'post_status' => 'publish', 'paged' => $paged, 'posts_per_page' => 9999 );

    } elseif (empty($_ids) && !$alllistings) {

    // $_ids array is empty because search got no results
    // $_ids array will be empty if page is an "All Listings" page. Don't run this code if is All Listings because All Listings will show all listings. This code will display "no results found"
$wpq = array ('post_type' =>'listing', 'meta_key' => $metakey, 'orderby' => $orderby, 'order' => $order, 'post__in' => array('0'),'post_status' => 'publish', 'paged' => $paged, 'posts_per_page' => 9999);
    } elseif ($alllistings) {
    // This is an All Listings page, so show all results
$wpq = array ('post_type' =>'listing', 'paged' => $paged, 'meta_key' => $metakey, 'orderby' => $orderby, 'order' => $order, 'post_status' => 'publish', 'posts_per_page' => 9999);
    }

    $listing = new WP_Query($wpq);?>

Не уверен, что я делаю неправильно.

1 Ответ

0 голосов
/ 25 января 2012

Вы должны дать нам немного больше деталей.Вы получаете ошибку?Если нет, то, что вы ожидаете увидеть, и что вы на самом деле видите?

Одна из возможных проблем заключается в том, что вы передаете "Price High-Low", даже если они выбирают "Price Low-High".Эта строка:

<option value="Price High-Low" <?php echo ($resultsorder == 'Price High-Low')? 'selected="selected"':''; ?>>Price Low-High</option>

неверна.

Редактировать:

Хорошо, я создал простую тему, которая дублирует то, что вам кажетсяиметь.В functions.php у меня есть:

<?php

add_action('init', 'create_listing_post_type');
function create_listing_post_type() {
    register_post_type('listing', array(
        'labels' => array(
            'name' => 'Listings',
            'singular_name' => 'Listing',
            'add_new_item' => 'Add a listing',
            'edit_item' => 'Edit listing',
            'new_item' => 'Add a listing',
            'search_items' => 'Find a listing',
            'not_found' => 'No listing found',
            'not_found_in_trash' => 'No listing found in the trash'
        ),
        'public' => true,
        'supports' => array('title', 'editor',  'custom-fields')
    ));
}
?>

Я зашел на экран администратора и добавил три списка:

  1. Листинг А, с адресом «Швейцария» и ценой10000.
  2. Листинг B, с адресом «Австралия» и ценой 50000.
  3. Листинг C, с адресом «Великобритания» и ценой 20000.

Затем я добавил новый шаблон в showlistings.php на основе вашего кода:

<?php
/**
 * Template Name: showlistings
 */

get_header();

//$resultsorder = 'Price High-Low';
//$resultsorder = 'Price Low-High';
$resultsorder = 'a-z';

switch ($resultsorder) {
    case "Price High-Low":
        $metakey = 'price';
        $order = 'DESC';
        $orderby = 'meta_value_num';
        break;
    case "Price Low-High":
        $metakey = 'price';
        $order = 'ASC';
        $orderby = 'meta_value_num';
        break;
    case "a-z":
        $metakey = 'address';
        $order = 'ASC';
        $orderby = 'meta_value';
        break;
}

$wpq = array (
    'post_type' =>'listing',
    'meta_key' => $metakey,
    'orderby' => $orderby,
    'order' => $order);

$listings = new WP_Query($wpq);

foreach( $listings->posts as $listing) {
    echo $listing->post_title;
    echo '<br />';
}

get_footer(); ?>

Хорошая новость заключается в том, что ваш код работает для меня: поскольку я изменил значение $resultsorder (изменив закомментированную строку), я получил ожидаемые результаты.

Так что осталось проверить несколько вещей:

  1. Значение $resultsorder установлено так, как вы ожидаете (т.е.отправляется ли он из вашей формы и заполняется ли он из переменной $_POST? поместите echo "\$resultsorder = $resultsorder"; где-нибудь в выходной файл для проверки.
  2. Сохраняются ли значения price способом, который MySQL может анализироватьих как числа? Например, «10000», а не (скажем) «$ 10000». WordPress имеет MySQL преобразовать числа в строки, добавив 0 ких - если они не могут быть проанализированы как числа, они все вернут 0, и любое упорядочение будет бессмысленным.
  3. Заполнены ли переменные $alllistings и $_ids, как вы ожидаете (то есть ожидаемыеветвь вашей if - then логики выполняется?Опять же, использование echo (или print_r) поможет вам проверить значения.
  4. Точно ли совпадают ваши строковые литералы?Возможно, стоит проверить, что нет никаких тонких различий между значениями вашей формы и значениями, которые вы проверяете в своем PHP.У вас могут быть похожие на вид, но разные символы или небольшие различия в регистре (например, «Цена Хай-Лоу» и «Цена Хай-Лоу»)

Я бы разбил ваше расследование.Убедитесь, что отправка формы работает, что аргументы запроса установлены правильно, а затем, что результаты соответствуют ожидаемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...