Сообщения запроса пользовательским полем 'цена'

Я хотел бы показать все сообщения в данном диапазоне цен. Например: Когда вводы данных пользователем 100 и 1000 (в двух отдельных полях формы) - мой сайт покажет все сообщения, которые имеют пользовательское поле, названное ценой, которая имеет числовое значение между 100 и 1000.

Найденный этим в соответствии с документацией для Запроса WP; однако, я не уверен относительно того, как я создаю запрос на основе входа от формы на моем сайте WordPress.

$args = array(
'post_type' => 'product',
'meta_query' => array(
    array(
        'key' => 'color',
        'value' => 'blue',
        'compare' => 'NOT LIKE'
    ),
    array(
        'key' => 'price',
        'value' => array( 20, 100 ),
        'type' => 'numeric',
        'compare' => 'BETWEEN'
    )
)
);
$query = new WP_Query( $args );

Спасибо за Ваше время.

6
19.03.2013, 01:37
3 ответа

Используйте pre_get_posts действие, чтобы обнаружить некоторый фильтр Вар в URL и отфильтровать запрос соответственно.

Например, скажите свои наборы формы price_low и price_high ПОЛУЧИТЕ Вар, таким образом, URL похож:

domain.com/?price_low=100&price_high=1000

Затем Ваша функция фильтра проверяет на присутствие тех Вар и создает meta_query. Этот пример проверяет, является ли это основной запрос на домашней странице, посмотрите страницу Conditional Tags для того, как проверить, происходят ли другие типы запросов, как категория или тег, и т.д.

function wpa_filter_home_query( $query ){
    if( $query->is_home()
    && $query->is_main_query()
    && isset( $_GET['price_low'] )
    && isset( $_GET['price_high'] ) ) {
        $meta_query = array(
            array(
                'key' => 'price',
                'value' => array( $_GET['price_low'], $_GET['price_high'] ),
                'type' => 'numeric',
                'compare' => 'BETWEEN'
            )
        );
        $query->set( 'meta_query', $meta_query );
    }
}
add_action( 'pre_get_posts', 'wpa_filter_home_query' );

РЕДАКТИРОВАНИЕ - пример простой формы для представления значений. Исключение action атрибут отправит форму текущей странице.

<form method="GET">
    <input type="text" name="price_low">
    <input type="text" name="price_high">
    <input type="submit">
</form>
6
19.02.2020, 22:05
  • 1
    Спасибо Milo! Проблема, которую я имею, с установкой 'price_low', и 'price_high' ПОЛУЧАЮТ Вар через форму. Можно ли обеспечить пример этого? –  Andrew Hendrie 19.03.2013, 13:38
  • 2
    постимени % посмотрите редактирование выше. –  Milo 19.03.2013, 16:47
  • 3
    РЕДАКТИРОВАНИЕ: просто собравшись задавать другой вопрос (не хотят добираться вне темы). –  Andrew Hendrie 21.03.2013, 03:40
  • 4
    Полностью получил эту работу. Желание я мог-признать Вас снова Milo! Миллион благодарностей. –  Andrew Hendrie 21.03.2013, 15:06
  • 5
    Попытка объединить этот запрос с Несколькими виджет Выбора Категории - какие-либо идеи относительно того, как я могу заставить все это произойти в одном запросе? Прямо сейчас пользователь должен отправить 2 запроса. Я отправил другой вопрос здесь: (wordpress.stackexchange.com/questions/91701 / …) спасибо в течение Вашего времени! –  Andrew Hendrie 21.03.2013, 15:18

У меня была удача с Полевым плагином Пользовательского запроса для этой точной проблемы прежде.

Я не на 100% уверен, что это будет работать, поскольку это не обновлялось в течение года, но это может стоить движения.

0
19.02.2020, 22:05
  • 1
    я использовал тот плагин, и он предоставляет мне URL, в котором я нуждаюсь. Например, если я использую: register_custom_queryable_field("price", array("dataType"=>"numeric")); и затем ссылка как это: http://www.yoursite.com/?price_min=200&price_max=800&order_by=price это сделает то, что я хочу. Проблема, которую я имею, соединяет веб-форму с этим процессом (я не хочу, чтобы пользователь ввел в URL или нажал на ссылку для предопределенного диапазона. Они должны смочь установить свои собственные числовые значения с формой. Иметь смысл? –  Andrew Hendrie 19.03.2013, 13:32

Спасибо Milo некоторое редактирование в Вашем коде

function wpa_filter_home_query( $query ){
    if( $query->is_home()
    && $query->is_main_query()
    && isset( $_GET['price_low'] )
    && isset( $_GET['price_high'] ) ) {
        $meta_query = array(
            array(
                'key' => 'price',
                'value' => $_GET['price_low'],
                'type' => 'numeric',
                'compare' => '>='
            )
        );
        $query->set( 'meta_query', $meta_query );
        $meta_query = array(
            array(
                'key' => 'price',
                'value' => $_GET['price_high'],
                'type' => 'numeric',
                'compare' => '<='
            )
        );
        $query->set( 'meta_query', $meta_query );
    }
}
add_action( 'pre_get_posts', 'wpa_filter_home_query' );
-1
19.02.2020, 22:05
  • 1
    Это - тот же anser Milo, дал, но вместо a BETWEEN оператор, который Вы используете два, сравнивает операторы. –  Mike Madern 21.06.2013, 12:45

Теги

Похожие вопросы