web-dev-qa-db-fra.com

Rechercher des pages de type de publication personnalisées et des champs personnalisés dans 2 menus déroulants?

Sur mes pages de type d'article personnalisé, j'ai des champs personnalisés que l'utilisateur peut modifier.
Ce que je veux, c’est un formulaire de recherche avec deux menus déroulants: un menu déroulant contenant toutes les pages de type publication personnalisée de niveau supérieur et l’autre menu déroulant permettant d’affiner les résultats pour afficher les pages contenant certaine valeur de champ personnalisé.

Jusqu'à présent, je n'ai pas réussi à faire filtrer les résultats via le champ personnalisé. Voici mon code de formulaire jusqu'à présent:

<form method="get" action="<?php echo get_permalink($properties_search_id); ?>">
            <input type="hidden" name="post_type" value="floor_plan" />
            <ul class="wpp_search_elements">
                <li class="wpp_search_group wpp_group_not_a_group">
                    <ul class="wpp_search_group wpp_group_not_a_group">
                        <li>
                            <label class="wpp_search_label wpp_search_label_bedrooms" for="wpp_search_element_7165">Bedrooms<span class="wpp_search_post_label_colon">:</span></label>
                            <div class="wpp_search_attribute_wrap">
                                <select name="bedrooms" class="bedrooms">
                                    <?php
                                        $metakey = 'number_of_bedrooms';
                                        $bedrooms = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = %s ORDER BY meta_value ASC", $metakey) );
                                        if ($bedrooms) {
                                        foreach ($bedrooms as $bedroom) {
                                          echo "<option value=\"" . $bedroom . "\">" . $bedroom . "</option>";
                                        }
                                        }
                                    ?>
                                </select>
                            </div>
                            <div class="clear"></div>
                        </li>
                        <li>
                            <label class="wpp_search_label wpp_search_label_property_type" for="wpp_search_element_7437">Property Type<span class="wpp_search_post_label_colon">:</span></label>
                            <div class="wpp_search_attribute_wrap">

                                 <?php
                                     $args = array(
                                        'child_of'     => 0,
                                        'sort_order'   => 'ASC',
                                        'sort_column'  => 'post_title',
                                        'hierarchical' => 2,
                                        'depth'         => 1,
                                        'post_type' => 'floor_plan'
                                        );
                                    wp_dropdown_pages( $args );
                                ?>

                            </div>
                            <div class="clear"></div>
                        </li>
                    </ul>
                <div class="clear"></div>
                </li>
                <li class="wpp_search_form_element submit">
                    <input type="submit" value="Search" class="wpp_search_button submit">
                </li>
            </ul>
        </form>

J'ai vraiment du mal à comprendre cela, si quelqu'un pouvait aider, ce serait grandement apprécié.

6
nathanp

On dirait que cette question date de plusieurs mois, mais c'est une bonne question, alors je la retire de la tombe.

Pour résoudre le problème, il faudrait intercepter toute recherche avec le filtre pre_get_posts et ajouter la méta-requête en fonction des informations fournies. Voici un aperçu de base de la solution, qui peut devenir un plugin ou aller dans le fichier functions.php de votre thème:

<?php
/**
 * Add a parameter for a custom field search
 */
add_filter('query_vars', 'wpse_35639_search_queryvars' );
function wpse_35639_search_queryvars( $qvars ) {
    $qvars[] = 'bedrooms';
    return $qvars;
}


/**
 * Intercept the posts query to add in our meta query if necessary
 */
add_action('pre_get_posts','wpse_35639_intercept_search');
function wpse_35639_intercept_search() {
    global $wp_query;

    if ( ! is_admin() && isset($wp_query->query_vars['bedrooms']) && is_numeric($wp_query->query_vars['bedrooms']) ) {
        # Limit the search to the floor_plan custom post type
        $wp_query->set('post_type', 'floor_plan');

        # This may seem unconventional, but we're setting that this is a search
        # even though WP doesn't recognize it as one. This is to leverage the search template
        $wp_query->is_search = true;

        # Set the meta query comparison
        $wp_query->set('meta_query', array(
            array(
                'key' => 'number_of_bedrooms',
                'value' => $wp_query->query_vars['bedrooms'],
                'compare' => '=',
                'type' => 'NUMERIC'
            )
        );
    }
}
?>

Notez que cela résout simplement la portion de champ personnalisé de la recherche. La recherche par page est beaucoup plus facile (et je suppose que vous avez déjà résolu ce problème).

1
Matthew Boynes