it-swarm.com.de

Suche nach benutzerdefinierten Beitragstypen und benutzerdefinierten Feldern in 2 Dropdown-Listen?

Auf meinen benutzerdefinierten Beitragstypseiten gibt es benutzerdefinierte Felder, die der Benutzer bearbeiten kann.
Ich möchte ein Suchformular mit 2 ausgewählten Dropdown-Listen haben: Eine Dropdown-Liste enthält alle benutzerdefinierten Beitragstypenseiten der obersten Ebene und die andere Dropdown-Liste enthält die Ergebnisse mit einem bestimmter benutzerdefinierter Feldwert.

Bisher konnte ich die Ergebnisse nicht über das benutzerdefinierte Feld filtern. Hier ist mein bisheriger Formularcode:

<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>

Ich habe wirklich Probleme, das herauszufinden, wenn jemand helfen könnte, wäre ich sehr dankbar.

6
nathanp

Sieht so aus, als ob diese Frage einige Monate alt ist, aber sie ist gut, also grabe ich sie aus dem Grab.

Die Art und Weise, wie ich es lösen würde, wäre, alle Suchvorgänge mit dem pre_get_posts-Filter abzufangen und die Meta-Abfrage basierend auf den bereitgestellten Informationen hinzuzufügen. Hier ist eine kurze Beschreibung der Lösung, die sich in ein Plugin verwandeln oder in die Datei functions.php Ihres Themas gehen kann:

<?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'
            )
        );
    }
}
?>

Beachten Sie, dass dies nur den benutzerdefinierten Feldteil der Suche löst. Die Suche nach Seiten ist viel einfacher (und ich nehme an, Sie haben das bereits gelöst).

1
Matthew Boynes