3

投稿をカテゴリ別にフィルタリングするウィジェットを設定したいと思います。たとえば、「国」と「滞在期間」という 2 つの異なるカテゴリとサブカテゴリがあるとします。これが私が持っているものの例です:

ここに画像の説明を入力

私が欲しいのは、投稿を複数のカテゴリでフィルタリングすることです。したがって、ユーザーが国「ラオス」と滞在期間「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にあったコードです

function my_query_vars($vars) { array_push($vars, 'countries', 'stays'); $vars を返します。} add_filter('query_vars', 'my_query_vars');

function set_checked($arr, $value) { $checked = ''; if (!empty($arr) && in_array($value, $arr)) $checked = 'checked'; $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?
4

2 に答える 2

3

フォームでこれを行う基本的な考え方は次のとおりです。

まず、新しいクエリ変数を登録して、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);
  }
}

私はそれをテストしていませんが、これはうまくいくはずです。

于 2013-05-21T09:32:33.430 に答える
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.
于 2013-05-21T08:59:59.677 に答える