it-swarm.com.de

Suchfilter über Plugin erstellen

Ich benutze WordPress für Immobilienprojekte, dafür verwende ich ein Theme zusammen mit einem Plugin (Realia Real Estate) für Immobilien. Ich glaube also, dass das nicht nebensächlich ist ... Meine Frage ist einfach, ich habe mehrere benutzerdefinierte Metaschlüssel wie property_baths (Badezimmer), property_beds (Zimmer) und etc ... Ich möchte einen Filter erstellen, einen erweiterte Suche in der WordPress-Verwaltung, in der Registerkarte "Beiträge". Ich brauche auch, dass diese Suche kumulativ ist, zum Beispiel, wenn die "Badezimmer" und die "Zimmer" beide gefüllt sind, sollten die Beiträge nach dem gefüllten gefiltert werden.

Nach langem Suchen habe ich einen Weg gefunden, dies zu tun, indem ich ein Plugin erstellt habe, aber der Code, den ich hier habe, übergibt nur 1 meta_key mit Ihrem meta_value. Ich brauche ihn, um mehrere meta_key mit ihren Werten zu übergeben.

Was ich bisher habe, ist Folgendes:

add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );

function wpse45436_admin_posts_filter_restrict_manage_posts(){
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }

    //only add filter to post type you want
    if ('property' == $type){
        //change this to the list of values you want to show
        //in 'label' => 'value' format
        $values = array(
            'Banheiros' => 'property_baths', 
            'Quartos' => 'property_beds'
        );

        $current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
        foreach ($values as $label => $value) {
            printf
            (
            '<input type="text" name="%s"%s placeholder="%s"></option>',
            $value, 
            $value == $current_v? ' value="'.$current_v.'"':'', 
            $label 
            );
        }
    }
}

add_filter('parse_query', 'wpse45436_posts_filter');

function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'property' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['property_baths']) && $_GET['property_baths'] != '') {

        $query->query_vars['meta_key'] = 'property_baths';
        $query->query_vars['meta_value'] = $_GET['property_baths'];
    }
}

Mit diesem Code (Plugin) kann ich nur 1 meta_key filtern, ich muss so vorgehen, dass ich mehrere "meta_keys" mit ihren Werten verwenden kann.

Ich habe Schleife versucht, ich habe Array versucht, aber nichts hat funktioniert. Ich hoffe mir kann jemand helfen ... Danke im Voraus ...

3

Sie können mehr als einen Filteraufruf hinzufügen, sodass jeder Ihrer benutzerdefinierten meta_keys in separatem Code behandelt werden kann und bei Ausführung die Abfrage kumulativ anpasst.

Schauen Sie sich vielleicht den Filter pre_get_posts an und nicht parse_query (obwohl die von mir vorgeschlagene Lösung möglicherweise in beiden Fällen funktionieren könnte). pre_get_posts gibt Ihnen Zugriff auf die aktuelle Abfrage, bevor sie von WordPress ausgeführt wird, und Sie begrenzen die Beiträge, die die Abfrage aus der Datenbank abruft.

Ich habe diesen Code nicht getestet. Es handelt sich hier nur um eine Bearbeitung Ihres Codes, um zu zeigen, wie Sie dies angehen können (überprüfen Sie daher die Syntax auf Fehler).

Sie würden mit so etwas enden:

add_filter('pre_get_posts', 'wpse45436_property_baths_posts_filter');

function wpse45436_property_baths_posts_filter( $query ){
    global $pagenow;
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'property' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['property_baths']) && $_GET['property_baths'] != '') {

        $query->query_vars['meta_key'] = 'property_baths';
        $query->query_vars['meta_value'] = $_GET['property_baths'];
    }
}

add_filter('pre_get_posts', 'wpse45436_property_beds_posts_filter');

function wpse45436_property_beds_posts_filter( $query ){
    global $pagenow;
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'property' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['property_beds']) && $_GET['property_beds'] != '') {

        $query->query_vars['meta_key'] = 'property_beds';
        $query->query_vars['meta_value'] = $_GET['property_beds'];
    }
}

Überprüfen Sie den Codex für weitere Details zum pre_get_posts-Filter

1
Paul Zee