2013-05-21 4 views
3

Я бы хотел настроить виджет для фильтрации сообщений по категориям. Предположим, у меня есть две разные категории: «Страны» и «продолжительность пребывания» с подкатегориями. Вот пример того, что у меня есть:Фильтровать сообщения по нескольким категориям: wordpress

enter image description here

То, что я хочу, чтобы фильтровать сообщения по нескольким категориям. Итак, если пользователь проверяет страну «Лаос» и продолжительность пребывания «2-4Days», я хотел бы получить только должности, в которых была добавлена ​​категория «Лаос» И категория «2-4Days» ,

Я попытался использовать заглушку Query Multiple Taxonomies. Тем не менее, это подключение - - получение всех сообщений категории "Лаос" и всех сообщений с длительностью пребывания "2-4Days".

Я знаю, что могу фильтровать сообщение с этим запросом, но мне нужна помощь для создания этого виджета с помощью кнопки отправки. Кроме того, я хотел бы настроить его для удаления родительских категорий и отображения их в качестве заголовка (снимите флажок «Страны» и «Длительность пребывания» и добавьте к ним определенный класс)?

Работа запроса:

<?php // cat 42=Laos  cat 57=2-4Days 
    <?php $my_query_1 = new WP_query(array('category__and' => array(42,57))); ?> 
    <?php while ($my_query_1->have_posts()) : $my_query_1->the_post(); ?> 
    <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to 
    <?php the_title(); ?>"><?php the_title(); ?><?php the_excerpt(); ?></a> 
    <?php endwhile; ?> 

Спасибо за помощь

Что я сделал:

  1. создать новую боковую панель, где я хочу, чтобы добавить новую форму
  2. Я создаю шаблон «sidebar-filters.php» этой новой боковой панели. Вот код, который у меня внутри.

    <div id="secondary" class="widget-area" role="complementary"> 
    I'm the sidebar filters 
    <?php 
    
        $current_countries = get_query_var('countries'); 
        $current_stays = get_query_var('stays'); 
    
        $countries = get_categories('child_of=62'); 
        $stays = get_categories('child_of=63'); 
    ?> 
    
    <form action="<?php the_permalink(); ?>" id="filterForm" method="post"> 
         <ul> 
           <li> 
            <label><b>Countries</b></label> 
           </li><br/> 
           <?php 
           foreach ($countries as $country) { 
    //     var_dump($country->cat_ID); 
    //     var_dump($country->name); 
            echo sprintf('<li><input type="checkbox" name="countries[]" id="checkbox_%s" value="%s" %s',$country->name , $country->cat_ID, set_checked($current_countries, $country)); 
            echo sprintf('/><label for="checkbox_%s">%s</label></li>',$country->name,$country->name); 
           } 
           ?>   
         </ul><br/><br/> 
         <ul> 
           <li> 
             <label><b>Length of stay</b></label> 
           </li><br/> 
           <?php 
           foreach ($stays as $stay) { 
    //     var_dump($stay->cat_ID); 
    //     var_dump($stay->slug); 
            echo sprintf('<li><input type="checkbox" name="stays[]" id="checkbox_%s" value="%s" %s',$stay->slug , $stay->cat_ID, set_checked($current_stays, $stay)); 
            echo sprintf('/><label for="checkbox_%s">%s</label></li>',$stay->slug,$stay->name); 
           } 
           ?>        
         </ul><br/><br/>  
         <ul> 
           <li> 
             <button type="submit">Send email</button> 
           </li> 
         </ul> 
         <input type="hidden" name="submitted" id="submitted" value="true" /> 
    </form> 
    

  3. А вот код, который я имел в своем function.php

функции my_query_vars ($ вары) { array_push ($ вары, 'страны', 'остается'); return $ vars; } add_filter ('query_vars', 'my_query_vars');

Функция set_checked ($ arr, $ value) { $ checked = ''; если (!empty ($ arr) & & in_array ($ value, $ arr)) $ checked = 'checked'; return $ checked; }

function my_query($query) 
{ 
    // You can use is_archive() or whatever you need here 
    if ($query->is_main_query() && is_search()) { 

    $cat_and = array(); 

    foreach (array('countries', 'stays') as $variable) { 
     $categories = get_query_var($variable); 

     if (!empty($categories)) { 
     $cat_and = array_merge($cat_and, $categories); 
     } 
    } 

    if (!empty($cat_and)) $query->set('category__and', $cat_and); 
    } 
} 
add_action('pre_get_posts', 'my_query'); 

But, I'm retrieving nothing for the moment, what do I am doing wrong? 

ответ

1
<?php 
    $checkboxArray = $_POST['checkbox']; //checkbox[] is name of all your checkboxes 
    $catIds = implode(',',$checkboxArray); 
    $my_query = new WP_Query('showposts=10&cat='.$catIds); ?> 

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

    <a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"> 

    <?php the_title(); ?></a> 

    <?php the_content(); ?> //optional, can also be the_excerpt 

    <?php endwhile; ?> 

You can change the value of showposts as you required. 
+0

Запрос, который я отправляю, работает, но я хотел бы знать, как я могу создать и обновить этот запрос в соответствии с выбранными флажками? – Romain

+0

см. Обновленный ответ –

+0

Спасибо за ваш ответ, но я хочу знать, как я могу создать этот виджет с кнопкой отправки? И как я могу настроить свой виджет? – Romain

2

Вот основная идея, чтобы сделать это с помощью формы:

Сначала вы должны зарегистрировать новый запрос Варс, так что вы можете использовать GET и иметь фильтры в URL (что вы можете позже переписать в случае необходимости):

add_filter('query_vars', 'my_query_vars'); 
function my_query_vars($vars) 
{ 
    array_push($vars, 'countries', 'stays'); 
    return $vars; 
} 

Затем создайте форму и распечатайте категории, используя имя массива для каждой группы флажков. Вам нужно будет восстановить флажки, которые были проверены после отправки формы, вы можете сделать это на той же странице.

function set_checked($arr, $value) 
{ 
    $checked = ''; 
    if (!empty($arr) && in_array($value, $arr)) $checked = 'checked'; 
    return $checked; 
} 

$current_countries = get_query_var('countries'); 
$current_stays = get_query_var('stays'); 

$countries = get_categories('child_of=id_for_countries'); 
$stays = get_categories('child_of=id_for_length-of-stay'); 

// Begin form 

foreach ($countries as $country) { 
    echo sprintf('<input type="checkbox" name="countries[]" value="%s" %s', $country->cat_ID, set_checked($current_countries, $country)); 
} 

foreach ($stays as $stay) { 
    echo sprintf('<input type="checkbox" name="stays[]" value="%s" %s/>', $stay->cat_ID, set_checked($current_stays, $stay)); 
} 

// End form 

Наконец, вам нужно изменить запрос для фильтрации в соответствии с этой переменной:

add_action('pre_get_posts', 'my_query'); 
function my_query($query) 
{ 
    // You can use is_archive() or whatever you need here 
    if ($query->is_main_query() && is_search()) { 

    $cat_and = array(); 

    foreach (array('countries', 'stays') as $variable) { 
     $categories = get_query_var($variable); 

     if (!empty($categories)) { 
     $cat_and = array_merge($cat_and, $categories); 
     } 
    } 

    if (!empty($cat_and)) $query->set('category__and', $cat_and); 
    } 
} 

Я не проверял, но это должно работать, надеюсь, что это помогает.

+0

Я работаю над этим – Romain

+0

Я обновляю свой вопрос, если вы можете посмотреть, было бы здорово, спасибо – Romain

+1

Думаю, вам, возможно, придется выбирать категории детей, используя родительский идентификатор вместо пули. Что-то вроде 'get_categories ('child_of = 123')' Проверьте документы здесь http://codex.wordpress.org/Function_Reference/get_categories – elclanrs

Смежные вопросы