admin管理员组

文章数量:1122846

I am trying to create a Search Filter within WordPress to filter through all the custom taxonomies within a Custom Post Type.

I have created a function that generates the dropdown so I can output each option value as a slug for my filter which is working already. My only issue is that the "Select All" option is not working.

The results come back with nothing found when Selecting All. The filter can be here.

The code I have used to create the function is:

function adopt_custom_taxonomy_dropdown( $taxonomy, $orderby = 'date', $order = 'DESC', $limit = '-1', $name, $show_option_all = null, $show_option_none = null ) {
$args = array(
    'orderby' => $orderby,
    'order' => $order,
    'number' => $limit,

);
$terms = get_terms( $taxonomy, $args );
$name = ( $name ) ? $name : $taxonomy;
if ( $terms ) {
    printf( '<select name="%s" class="postform">', esc_attr( $name ) );
    if ( $show_option_all ) {
        printf( '<option value="0">%s</option>', esc_html( $show_option_all ) );
    }
    if ( $show_option_none ) {
        printf( '<option value="-1">%s</option>', esc_html( $show_option_none ) );
    }
    foreach ( $terms as $term ) {
        printf( '<option value="%s">%s</option>', esc_attr( $term->slug ), esc_html( $term->name ) );
    }
    print( '</select>' );
}
}

and this is where the results are being pulled to...

<?php
        if (isset($_GET["farm-type"]) && empty($_GET["location-farms"])){

        $farm_type = $_GET["farm-type"];

        $myquery1['tax_query'] = array(
            array(
                'taxonomy' => 'farm-type',
                'terms' => array($farm_type),
                'field' => 'slug',

            ),
        );
        query_posts($myquery1);

        }
        ?>

        <?php
        if (isset($_GET["farm-type"]) && isset($_GET["location-farms"])){

        $farm_type = $_GET["farm-type"];
        $farm_location = $_GET["location-farms"];

        $myquery2['tax_query'] = array(
            array(
                'taxonomy' => 'farm-type',
                'terms' => array($farm_type),
                'field' => 'slug',
            ),
            array(
                'taxonomy' => 'location-farms',
                'terms' => array($farm_location),
                'field' => 'slug',
            ),
        );
        query_posts($myquery2);

        }
        ?>

I am trying to create a Search Filter within WordPress to filter through all the custom taxonomies within a Custom Post Type.

I have created a function that generates the dropdown so I can output each option value as a slug for my filter which is working already. My only issue is that the "Select All" option is not working.

The results come back with nothing found when Selecting All. The filter can be here.

The code I have used to create the function is:

function adopt_custom_taxonomy_dropdown( $taxonomy, $orderby = 'date', $order = 'DESC', $limit = '-1', $name, $show_option_all = null, $show_option_none = null ) {
$args = array(
    'orderby' => $orderby,
    'order' => $order,
    'number' => $limit,

);
$terms = get_terms( $taxonomy, $args );
$name = ( $name ) ? $name : $taxonomy;
if ( $terms ) {
    printf( '<select name="%s" class="postform">', esc_attr( $name ) );
    if ( $show_option_all ) {
        printf( '<option value="0">%s</option>', esc_html( $show_option_all ) );
    }
    if ( $show_option_none ) {
        printf( '<option value="-1">%s</option>', esc_html( $show_option_none ) );
    }
    foreach ( $terms as $term ) {
        printf( '<option value="%s">%s</option>', esc_attr( $term->slug ), esc_html( $term->name ) );
    }
    print( '</select>' );
}
}

and this is where the results are being pulled to...

<?php
        if (isset($_GET["farm-type"]) && empty($_GET["location-farms"])){

        $farm_type = $_GET["farm-type"];

        $myquery1['tax_query'] = array(
            array(
                'taxonomy' => 'farm-type',
                'terms' => array($farm_type),
                'field' => 'slug',

            ),
        );
        query_posts($myquery1);

        }
        ?>

        <?php
        if (isset($_GET["farm-type"]) && isset($_GET["location-farms"])){

        $farm_type = $_GET["farm-type"];
        $farm_location = $_GET["location-farms"];

        $myquery2['tax_query'] = array(
            array(
                'taxonomy' => 'farm-type',
                'terms' => array($farm_type),
                'field' => 'slug',
            ),
            array(
                'taxonomy' => 'location-farms',
                'terms' => array($farm_location),
                'field' => 'slug',
            ),
        );
        query_posts($myquery2);

        }
        ?>
Share Improve this question edited May 26, 2014 at 12:56 damienoneill2001 asked May 24, 2014 at 17:06 damienoneill2001damienoneill2001 819 bronze badges 3
  • What processes the search? – s_ha_dum Commented May 24, 2014 at 18:52
  • Added extra code to show where the search is being pulled to @s_ha_dum – damienoneill2001 Commented May 26, 2014 at 7:39
  • I would strongly advise against the use of query_posts, there is no reason this couldn't use a WP_Query object or the pre_get_posts filter to implement this – Tom J Nowell Commented Dec 24, 2021 at 0:06
Add a comment  | 

1 Answer 1

Reset to default 0

Couple of notes:

  1. Your form action is incorrect: <form method="get" action="http://www.adoptapet.ie/archive-farm/">. The page is <form method="get" action="http://www.adoptapet.ie/archive-farms/">
  2. You should reorder your argument list for adopt_custom_taxonomy_dropdown(). As written, most of your arguments have default values and can be omitted when the function is called, except that as written argument five doesn't have a default so you can't in practice omit two, three, and four. Move $name to the front-- much better usability.

    adopt_custom_taxonomy_dropdown( $taxonomy, $name, $orderby = 'date', $order = 'DESC', $limit = '-1', $show_option_all = null, $show_option_none = null )
    
  3. Don't use query_posts(), ever. It clobbers the main query and can cause numerous problems.
  4. While I have not edited the code into the suggestions below, you should not ever use user supplied data like $_GET without sanitizing it. $_GET and $_POST are not safe.

I think your problem is mostly a logic issue. This...

isset($_GET["farm-type"]) && isset($_GET["location-farms"])

.... is always going to be true. $_GET["farm-type"] and $_GET["location-farms"] are always going to be set when your form submits, even if they are empty. You should be using !empty() instead.

And you can clean up this code a lot:

if (!empty($_GET["farm-type"])){
  $farm_type = $_GET["farm-type"];
  $myquery['tax_query'][] = 
    array(
      'taxonomy' => 'farm-type',
      'terms' => array($farm_type),
      'field' => 'slug',
    );
}

if (!empty($_GET["location-farms"])){
  $farm_location = $_GET["location-farms"];
  $myquery['tax_query'][] = 
    array(
      'taxonomy' => 'location-farms',
      'terms' => array($farm_location),
      'field' => 'slug',
    );
}

if (!empty($myquery)) {
  $q = new WP_Query($myquery); // instead of wp_query()
  var_dump($q);
}

And you probably want an AND relationship between your two components.

if (!empty($myquery)) {
  if (1 < count($myquery['tax_query'])) {
    $myquery['tax_query']['relation'] = 'AND';
  }
  $q = new WP_Query($myquery);
  var_dump($q->request); // debug
}

Now, if you pass an empty string for your "Select All" option instead of a number, I believe you should get the results you are looking for.

本文标签: phpSelect All not working in a WordPress search filter