Căutare live cu ajax pentru titlul articolelor

22 sept. 2016, 01:18:54
Vizualizări: 48.7K
Voturi: 5

Creez o căutare live cu AJAX pentru a filtra titlurile articolelor în tema mea WordPress. Când scriu ceva în input, îmi arată toate articolele în rezultate, nu le filtrează pentru a obține articolele personalizate.

Cum să faci o căutare live și să găsești un articol cu AJAX??

Function.php

<?php 
// Adăugăm acțiunile pentru utilizatorii logați și nelogați
add_action('wp_ajax_my_action' , 'data_fetch');
add_action('wp_ajax_nopriv_my_action','data_fetch');

function data_fetch(){
    $the_query = new WP_Query(array('post_per_page'=>5));
    if( $the_query->have_posts() ) :
        while( $the_query->have_posts() ): $the_query->the_post(); ?>
            <h2><a href="<?php echo esc_url( post_permalink() ); ?>"><?php the_title();?></a></h2>

        <?php endwhile;
        wp_reset_postdata();  
    endif;
    die();
}?>

Script:

<script>
function fetch(){
    // Trimitem cererea AJAX către WordPress
    $.post('<?php echo admin_url('admin-ajax.php'); ?>',{'action':'my_action'},
    function(response){
        $('#datafetch').append(response);
        console.log(result);
    });
}
</script>

HTML:

<input type="text" onkeyup="fetch()"></input>
    <div id="datafetch">
</div>
2
Comentarii

Deci vrei ca interogarea să caute în titlurile postărilor (iar cuvântul cheie din titlul postării este transmis prin input-ul din formularul tău HTML)?

Ahmed Fouad Ahmed Fouad
22 sept. 2016 01:21:39

@AhmedElmahdy DA

FRQ6692 FRQ6692
22 sept. 2016 01:23:10
Toate răspunsurile la întrebare 4
4
22

Iată o soluție funcțională (testată așa cum este)

HTML-ul (poate face parte din conținutul paginii)

<input type="text" name="keyword" id="keyword" onkeyup="fetch()"></input>

<div id="datafetch">Rezultatele căutării vor apărea aici</div>

JavaScript (se adaugă în functions.php al temei)

// adăugăm js-ul pentru interogarea ajax
add_action( 'wp_footer', 'ajax_fetch' );
function ajax_fetch() {
?>
<script type="text/javascript">
function fetch(){

    jQuery.ajax({
        url: '<?php echo admin_url('admin-ajax.php'); ?>',
        type: 'post',
        data: { action: 'data_fetch', keyword: jQuery('#keyword').val() },
        success: function(data) {
            jQuery('#datafetch').html( data );
        }
    });

}
</script>

<?php
}

Și în final apelul AJAX se adaugă în functions.php al temei

// funcția ajax
add_action('wp_ajax_data_fetch' , 'data_fetch');
add_action('wp_ajax_nopriv_data_fetch','data_fetch');
function data_fetch(){

    $the_query = new WP_Query( array( 'posts_per_page' => -1, 's' => esc_attr( $_POST['keyword'] ), 'post_type' => 'post' ) );
    if( $the_query->have_posts() ) :
        while( $the_query->have_posts() ): $the_query->the_post(); ?>
            
            <h2><a href="<?php echo esc_url( get_permalink() ); ?>"><?php the_title();?></a></h2>

        <?php endwhile;
        wp_reset_postdata();  
    endif;

    die();
}

Adăugare: Iată cum am făcut funcția mea AJAX să caute exact:

// funcția ajax
add_action('wp_ajax_data_fetch' , 'data_fetch');
add_action('wp_ajax_nopriv_data_fetch','data_fetch');
function data_fetch(){

    $the_query = new WP_Query( 
      array( 
        'posts_per_page' => -1, 
        's' => esc_attr( $_POST['keyword'] ), 
        'post_type' => 'post' 
      ) 
    );


    if( $the_query->have_posts() ) :
        while( $the_query->have_posts() ): $the_query->the_post();

$myquery = esc_attr( $_POST['keyword'] );
$a = $myquery;
$search = get_the_title();
if( stripos("/{$search}/", $a) !== false) {?>
            <h4><a href="<?php echo esc_url( get_permalink() ); ?>"><?php the_title();?></a></h4>
        <?php
                                  }
    endwhile;
        wp_reset_postdata();  
    endif;

    die();
}
22 sept. 2016 01:46:05
Comentarii

Știi vreo metodă de a căuta cuvântul cheie doar în titlu sau doar în descriere?

Fanky Fanky
13 feb. 2020 20:06:19

poate doar folosind filtrul posts_where în loc de 's' ca în https://wordpress.stackexchange.com/questions/298888/wp-query-where-title-begins-with-a-specific-letter)

Fanky Fanky
13 feb. 2020 20:17:51

Am nevoie ca postările să fie afișate în loc de textul "rezultatele căutării vor apărea aici", apoi când se face căutarea, doar să filtreze rezultatele. Este posibil acest lucru cu această metodă? Momentan am implementat asta și funcționează, dar am o pagină goală înainte de efectuarea căutării.

Amir Khadem Amir Khadem
14 iul. 2021 03:03:37

Răspuns excelent. Am înlocuit doar post_permalink() (învechit) cu get_permalink()

User User
12 ian. 2022 04:09:27
0

Ați uitat să îl apelați ca searchinput, puteți lipi codul de mai jos în functions.php

// funcția ajax
add_action('wp_ajax_data_fetch' , 'data_fetch');
add_action('wp_ajax_nopriv_data_fetch','data_fetch');
function data_fetch(){

    $the_query = new WP_Query( array( 'posts_per_page' => 5, 's' => esc_attr( $_POST['keyword'] ), 'post_type' => 'post' ) );
    if( $the_query->have_posts() ) :
        while( $the_query->have_posts() ): $the_query->the_post(); ?>

            <a href="<?php echo esc_url( post_permalink() ); ?>"><?php the_title();?></a>

        <?php endwhile;
        wp_reset_postdata();  
    else: 
        echo '<h3>Nu s-au găsit rezultate</h3>';
    endif;
        die();
    }

    // adăugăm js-ul pentru preluarea ajax
    add_action( 'wp_footer', 'ajax_fetch' );
    function ajax_fetch() {
    ?>
    <script type="text/javascript">
    function fetchResults(){
        var keyword = jQuery('#searchInput').val();
        if(keyword == ""){
            jQuery('#datafetch').html("");
        } else {
            jQuery.ajax({
                url: '<?php echo admin_url('admin-ajax.php'); ?>',
                type: 'post',
                data: { action: 'data_fetch', keyword: keyword  },
                success: function(data) {
                    jQuery('#datafetch').html( data );
                }
            });
        }

    }
    </script>

    <?php
    }

După ce ați terminat, găsiți și deschideți searchform.php. Acum, ceea ce trebuie să faceți este să înlocuiți elementul id cu cel de mai sus (searchInput) și să adăugați acest cod

onkeyup=featechResult()"

Lângă elementul id, astfel încât codul final va arăta astfel

    <form method="get" class="td-search-form-widget" action="<?php echo esc_url(home_url( '/' )); ?>">
    <div role="search">
        <input class="td-widget-search-input" type="text" value="<?php echo get_search_query(); ?>" name="s" id="searchInput" onkeyup="fetchResults()" /><input class="wpb_button wpb_btn-inverse btn" type="submit" id="searchsubmit" value="<?php _etd('Căutare', TD_THEME_NAME)?>" />
    </div>
</form>

Asigurați-vă că faceți modificările în child theme. Ultimul pas: adăugați <div id="datafeatch"></div> chiar deasupra și veți putea vedea căutarea live în formularul de căutare.

Puteți face acest lucru și prin intermediul plugin-ului de căutare live, o metodă mai ușoară dacă nu știți să codificați. Sper că vă ajută.

7 oct. 2019 08:48:44
0
/* Completat în profilul de administrator */
add_action( 'show_user_profile', 'extra_user_profile_fields' );
add_action( 'edit_user_profile', 'extra_user_profile_fields' );
function extra_user_profile_fields( $user ) { ?>
    <h3><?php _e("Informații suplimentare de profil", "blank"); ?></h3>

    <table class="form-table">
    <tr>
        <th><label for="address"><?php _e("Adresă"); ?></label></th>
        <td>
            <input type="text" name="postSearch" id="postSearch" value="<?php echo esc_attr( get_the_author_meta( 'postSearch', $user->ID ) ); ?>" class="regular-text" /><br />
            <span class="description"><?php _e("Vă rugăm să introduceți adresa dumneavoastră."); ?></span>
            <div id="datafetch"></div>
        </td>
    </tr>
    </table>
<?php }


// Apelul jQuery Ajax aici
add_action( 'admin_footer', 'ajax_fetch' );
function ajax_fetch() {
?>
<script type="text/javascript">

    (function($){
        var searchRequest = null;

        jQuery(function () {
            var minlength = 3;

            jQuery("#postSearch").keyup(function () {
                var that = this,
                value = jQuery(this).val();

                if (value.length >= minlength ) {
                    if (searchRequest != null) 
                        searchRequest.abort();
                    searchRequest = jQuery.ajax({
                        type: "POST",
                        url: "<?php echo admin_url('admin-ajax.php'); ?>",
                        data: {

                            action: 'data_fetch',
                            search_keyword : value

                        },
                        dataType: "html",
                        success: function(data){
                            //trebuie să verificăm dacă valoarea este aceeași
                            if (value==jQuery(that).val()) {
                                jQuery('#datafetch').html(data);
                            }
                        }
                    });
                }
            });
        });
    }(jQuery));
</script>

<?php
}


// funcția ajax
add_action('wp_ajax_data_fetch' , 'data_fetch');
add_action('wp_ajax_nopriv_data_fetch','data_fetch');
function data_fetch(){

    $the_query = new WP_Query( array( 'posts_per_page' => -1, 's' => esc_attr( $_POST['search_keyword'] ), 'post_type' => 'post' ) );
    if( $the_query->have_posts() ) :
        while( $the_query->have_posts() ): $the_query->the_post(); ?>
            <h2><a href="<?php echo esc_url( post_permalink() ); ?>"><?php the_title();?></a></h2>
        <?php endwhile;
        wp_reset_postdata();  
    endif;

    die(); 
}
28 ian. 2019 11:29:07
1
-2

Am folosit acest plugin:

ajax-search-pro-for-wordpress-live-search-plugin

Este cel mai bun plugin

și poți face asta în 5 secunde folosindu-l.

Am folosit acest plugin în multe dintre proiectele mele.

22 sept. 2016 02:17:29
Comentarii

Îmi pare rău să menționez (și nu luați asta personal) dar vă rog să nu răspundeți cu o sugestie de plugin! Știu că utilizatorii de aici pe wpse nu pot adăuga comentarii până nu acumulează un anumit număr de puncte de reputație. De asemenea, este bine cunoscut faptul că wpse este destinat pentru a cere ajutor cu codarea și nu pentru a găsi un plugin, pentru asta există repository-ul de pe WordPress.org. Și mai rău, sfatul vostru este pentru un plugin comercial de la terți. După părerea mea, acest lucru nu este corect și voi raporta acest răspuns.

Charles Charles
23 sept. 2016 13:52:12