Ajax-Filter für WordPress

Lesezeit: 5 Minuten

Ajax Filter fur WordPress
Fernanda Sepulveda Sure

nach langem recherchieren bin ich auf das gestoßen: https://rudrastyh.com/wordpress/ajax-post-filters.html

Aber ich kann es nur zum Laufen bringen, wenn zwei Optionen ausgewählt sind.

Ich gebe Ihnen etwas Kontext: Ich habe ein CPT namens „Contratistas“, das zwei benutzerdefinierte Taxonomien „especialidad“ und „industria“ hat, beide haben jeweils zwei Begriffe „especialidad“ -> „tecnologia“ und „auditoria“; ‘industria’ -> ‘cultivo’ und ‘depocito’

hier ist meine funktion:

function misha_filter_function(){
    $args = array(
        'orderby' => 'date', // we will sort posts by date
        'order' => $_POST['date'], // ASC or DESC
        'post_per_page' => -1,
        'post_type' => 'contratista'
    );
    // for taxonomies / categories
    if( isset( $_POST['filtroEspecialidad'] ) && isset ($_POST['filtroIndustria'])  ) {
        $args['tax_query'][] = array(
         //'relation' => 'AND',
            array(
                'taxonomy' => 'especialidad',
                'field' => 'id',
                'terms' => $_POST['filtroEspecialidad']
            ),
            array(
                'taxonomy' => 'industria',
                'field' => 'id',
                'terms' => $_POST['filtroIndustria']
            ),
        );
    
    } elseif( !isset($_POST['filtroEspecialidad'] ) && isset($_POST['filtroIndustria'])  ) {
        $args['tax_query'][] = array(
            'taxonomy' => 'industria',
            'field' => 'id',
            'terms' => $_POST['filtroIndustria']
        );
    
    } elseif( isset( $_POST['filtroEspecialidad'] ) && !isset($_POST['filtroIndustria'])  ) {
        $args['tax_query'][] = array(
            'taxonomy' => 'especialidad',
            'field' => 'id',
            'terms' => $_POST['filtroEspecialidad']
        );
    }

Es funktioniert, wenn Sie etwas aus beiden Taxonomien auswählen, aber wenn eine leer ist, heißt es: “Es gibt keinen Beitrag”.

Als Bonus möchte ich alle Beiträge vor dem Filtern anzeigen.

Ich hoffe jemand kann mir helfen! Danke! Ich bin ziemlich neu bei WordPress

BEARBEITEN! Hier ist mein js und mein Formular, ich bin hier ratlos, ich kann nicht herausfinden, was falsch ist 🙁

jQuery(function($){
    $('#filter').submit(function(){
        var filter = $('#filter');
        $.ajax({
            url:filter.attr('action'),
            data:filter.serialize(), // form data
            type:filter.attr('method'), // POST
            beforeSend:function(xhr){
                filter.find('.filtrar').text('Procesando...'); // changing the button label
            },
            success:function(data){
                filter.find('.filtrar').text('Filtrar'); // changing the button label back
                $('#response').html(data); // insert data
            }
        });
        return false;
    });

meine php-datei:

<form action="<?php echo site_url() ?>/wp-admin/admin-ajax.php" method="POST" id="filter">
                    <div class="titulo mb-3">
                        <h3>Especialidad</h3>
                    </div>
                    <?php
                        if( $terms = get_terms( array( 'taxonomy' => 'especialidad', 'orderby' => 'name' ) ) ) : 
                 
                            echo '<select name="filtroEspecialidad"><option value="">Seleccione una especialidad...</option>';
                            foreach ( $terms as $term ) :
                                echo '<option value="' . $term->term_id . '">' . $term->name . '</option>'; // ID of the category as the value of an option
                            endforeach;
                            echo '</select>';
                        endif;
                        
                    ?>
                    <div class="titulo my-3">
                        <h3>Industrias</h3>
                    </div>
                    <?php   
                        if( $terms = get_terms( array( 'taxonomy' => 'industria', 'orderby' => 'name' ) ) ) : 
                 
                            echo '<select name="filtroIndustria"><option value="">Seleccione una industria...</option>';
                            foreach ( $terms as $term ) :
                                echo '<option  value="' . $term->term_id . '">' . $term->name . '</option>'; // ID of the category as the value of an option
                            endforeach;
                            echo '</select>';
                        endif;
                    ?>  
                    <button class="my-3 filtrar">Filtrar</button>
                    <a href="" id="clear">Clear</a>
                    <input type="hidden" name="action" value="myfilter">
                </form>

Vielleicht möchten Sie die geben Taxonomieparameter von WP_Query() noch ein Blick. Leider ist WordPress ein wenig locker damit id Parameternamen kontextbezogen. Ich bin mir nicht ganz sicher, ob Ihr anfängliches “beide” so funktioniert, wie Sie es beabsichtigen, denn 'field' => 'id' ist eigentlich ungültig.

Aus den Dokumenten:

field (string) – Taxonomiebegriff auswählen nach. Mögliche Werte sind term_id, name, slug oder term_taxonomy_id. Standardwert ist term_id.

id ist eigentlich keine gültige Option. Wenn Sie nur die verwenden term_id, darauf solltest du verzichten können. Sie können die auch einfach programmgesteuert hinzufügen tax_query Array-Argumente basierend darauf, ob dieser Filter gesetzt ist, anstatt nach “both set, this set/that unset, this unset, that set“, so etwas vielleicht?

function misha_filter_function(){
    $args = array(
        'orderby'       => 'date', // we will sort posts by date
        'order'         => $_POST['date'], // ASC or DESC
        'post_per_page' => -1,
        'post_type'     => 'contratista'
    );

    if( isset($_POST['filtroEspecialidad']) || isset($_POST['filtroIndustria']) ){
        $args['tax_query'] = array();
        
        if( isset($_POST['filtroEspecialidad']) ){
            $args['tax_query'][] = array(
                'taxonomy' => 'especialidad',
                'terms'    => $_POST['filtroEspecialidad']
            );
        }
        
        if( isset($_POST['filtroIndustria']) ){
            $args['tax_query'][] = array(
                'taxonomy' => 'industria',
                'terms'    => $_POST['filtroIndustria']
            );
        }

        if( count($args['tax_query']) > 1 ){
            $args['tax_query']['relation'] = 'AND';
        }
    }

    // Run WP_Query with new $args, etc.
}

Ich bin mir nicht sicher, ob die $_POST Werte sind Arrays oder einzelne Zahlen, aber Sie möchten diese vielleicht mit validieren array_map und/oder absint Wenn Sie vom Benutzer bereitgestellte Eingaben verwenden, es sich aber nur um IDs handelt, sollte das oben Genannte vorerst funktionieren.

  • Das macht sehr viel Sinn und ist eine bessere Verwendung des Codes, aber es funktioniert immer noch nur, wenn sowohl ‘especialidad’ als auch ‘industria’ ausgewählt sind, aber ich denke, DAS ist der Weg, also werde ich damit arbeiten !! Danke!! (Wissen Sie, wie ich alle Beiträge vor dem Filtern anzeigen kann?)

    – Fernanda Sepulveda Sure

    18. Dezember 2020 um 12:59 Uhr

  • Wenn das obige nicht funktioniert hat (es sollte), kann leider etwas anderes im Spiel sein, insbesondere abhängig davon, wie/wann Sie die Funktion aufrufen, ob die Hauptabfrage geändert/ersetzt wird oder nicht, ob die $_POST[‘filtro…’] Variablen werden als leere Zeichenfolgen usw. gesendet (überprüfen Sie, ob sie nicht gesendet werden, wenn sie nicht ausgewählt wurden). Betreff: Vorher anzeigen, das hängt wiederum davon ab, wie die ursprüngliche Seitenabfrage auf Ihrer speziellen Website aussieht

    – Xhynk

    18. Dezember 2020 um 21:27 Uhr

  • Ich habe meinen Code aktualisiert! Danke für Ihre Hilfe!!

    – Fernanda Sepulveda Sure

    21. Dezember 2020 um 15:14 Uhr

  • der .serialize() Funktion übergibt leere Werte. Du könntest versuchen zu ersetzen data:filter.serialize(), mit data: $('#filter :input').filter(function(index, element) { return $(element).val() != ''; }).serialize(), leere Werte zu entfernen und/oder zu verwenden empty($_POST['filter_name_here']) anstatt isset()

    – Xhynk

    21. Dezember 2020 um 19:39 Uhr

  • DANKE!!!! ES KLAPPT!!! Du hast mir viele Themen zum Lernen gegeben! (Ich habe den “leeren” Ansatz ausprobiert, jetzt überprüfe ich den anderen!)

    – Fernanda Sepulveda Sure

    21. Dezember 2020 um 20:33 Uhr


998390cookie-checkAjax-Filter für WordPress

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy