• User Attivo

    Risultati ricerca divisi per cadecoria. Hardcoding

    Ragazzi, spero che ci sia qualche volenteroso che sia capace e che abbia voglia di aiutarmi.

    Vorrei migliorare la pagina di ricerca di wordpress in modo da mostrare i risultati divisi per categoria.

    Esempio completo del risultato:

    Ho i seguenti post:

    • Post uno (categoria3)
    • Post due (categoria4)
    • Post tre (categoria3)
    • Post quattro (categoria2)

    Mettiamo che tutti questi post contengano la parola "pluto" nel titolo, andrò a cercare quindi pluto e mi verranno mostrati tutti e quattro i post. Vorrei che venissero mostrati in questo modo:

    Categoria2

    • Post quattro

    Categoria3

    • Post uno
    • Post tre

    Categoria4

    • Post2

    Inizialmente non pensavo fosse così complicato, ho creato dunque una pagina personalizzata search.php che esegue una query personalizzata.

    Vi posto il codice

    
    $chiave = $_GET['s'];
    // Questa è la parola chiave che viene passata dal form di ricerca
    
    $query_categorie = mysql_query("SELECT  cat.cat_ID as cat_id, cat.cat_name as cat_name
    FROM 0wp_categories as cat
    ORDER BY cat.cat_ID ASC")or die(mysql_error());
    // Questa query seleziona tutte le categorie del mio blog 
    
    while($dati = mysql_fetch_array($query_categorie)) {
    $categoria_search_id  = $dati['cat_id'];
    $categoria_search_name = $dati['cat_name'];
    
    // Per ogni categoria trovata esegue una query cercando la parola chiave nel titolo del post
    
    $pageposts = $wpdb->get_results("SELECT * 
    FROM 0wp_posts as post 
    JOIN 0wp_categories as cat
    JOIN 0wp_post2cat as post2cat
    ON cat.cat_ID = post2cat.category_id
    AND post.ID = post2cat.post_id
    WHERE cat.cat_ID = '$categoria_search_id'
    AND post.post_title LIKE '%$chiave%' 
    AND post.post_status = 'publish' AND post.post_date < NOW() 
    ORDER BY post.post_date DESC
    ", OBJECT);
    ?>
    
    <?php if ($pageposts): ?>
    <h6><?php echo $categoria_search_name;?></h6>
    <?php foreach ($pageposts as $post): ?>
     <?php setup_postdata($post); ?>
    
    // In questa parte (all'interno del ciclo foreach) vengono stampati i risultati secondo una determinata formattazione
    
     <?php endforeach; ?>
    
     <?php next_posts_link('&laquo; Precedenti') ?> 
    <?php previous_posts_link('Successivi &raquo;') ?>
    
     <?php else : ?>
     <?php endif; ?>
    
    ```Per chi ha avuto la pazienza di seguirmi fin qui dico che lo script funziona, ottengo tutti i risultati il problema è che non riesco ad avere la paginazione.
    
    Compaiono infatti tutti i post che corrispondono a quella parola chiave ma vorrei far si che i risultati vengano paginati (rendendoli navigabili tramite next_posts_link e previous_posts_link). Purtroppo questo non accade... 
    
    E' la prima volta che mi addentro nella modifica del loop e credo di star facendo non poca confusione. Se c'è qualcuno che potrebbe aiutarmi avrebbe tutta la mia stima ;)

  • User Attivo

    Io proverei a scrivere in un plugin:
    [php]add_filter('posts_where', 'penny_custom_search');

    function penny_custom_search($where){
    if(is_search())
    exit($where);
    return $where;
    }
    [/php]

    E ad eseguire una ricerca standard di WordPress.

    Questo codicillo dovrebbe stampare il valore di WHERE della query di wordpress.

    Partendo da quello, con una espressione regolare, ne modifichi il valore.

    Quando sei soddisfatto, anziché exit, fai ritornare il valore di where modificato. Così facendo hai appena modificato il loop di wordpress e tutte le funzioni integrate dovrebbero funzionare 🙂


  • User Attivo

    @Fra_T said:

    Io proverei a scrivere in un plugin:
    [php]add_filter('posts_where', 'penny_custom_search');

    function penny_custom_search($where){
    if(is_search())
    exit($where);
    return $where;
    }
    [/php]E ad eseguire una ricerca standard di WordPress.

    Questo codicillo dovrebbe stampare il valore di WHERE della query di wordpress.

    Partendo da quello, con una espressione regolare, ne modifichi il valore.

    Quando sei soddisfatto, anziché exit, fai ritornare il valore di where modificato. Così facendo hai appena modificato il loop di wordpress e tutte le funzioni integrate dovrebbero funzionare 🙂

    Ti ringrazio, ma non riesco a capire bene quello che mi proponi... sarà che ho pochissime ore di sonno e ora sono scimunito :S

    Potresti farmi un esempio concreto dell'utilizzo di questa funzione? Conosco abbastanza php ma al momento mi sfugge il significato della funzione 😞


  • User Attivo

    Utilizza le API di WordPress.

    I dati utilizzati nel loop di WordPress sono generati da un query. Ogni parte della query può essere filtrata (Join, where, limit, ...).

    Con add_filter('posts_where', 'penny_custom_search') faccio in modo che il valore di WHERE sia passato alla funzione penny_custom_search prima che la query sia eseguita.

    Se è una ricerca, la funzione penny_custom_search blocca lo script e stampa il valore di where (così puoi vedere cosa modificare per fare una ricerca solo nel titolo dei post), altrimenti ritorna il valore originale di $where e lo script procede naturalmente.


  • User Attivo

    @Fra_T said:

    Utilizza le API di WordPress.

    I dati utilizzati nel loop di WordPress sono generati da un query. Ogni parte della query può essere filtrata (Join, where, limit, ...).

    Con add_filter('posts_where', 'penny_custom_search') faccio in modo che il valore di WHERE sia passato alla funzione penny_custom_search prima che la query sia eseguita.

    Se è una ricerca, la funzione penny_custom_search blocca lo script e stampa il valore di where (così puoi vedere cosa modificare per fare una ricerca solo nel titolo dei post), altrimenti ritorna il valore originale di $where e lo script procede naturalmente.

    Fra_T(ac?) ti ringrazio tanto per la disponibilità ma non riesco ancora a capire 😞

    Il fatto è che non ho ben compreso il sistema di funzionamento della ricerca di wordpress, la pagina search.php del template non contiene altro che la formattazione dei risultati...

    Sato pensando a questo punto di creare un motore di ricerca da 0, estraendo i dati dal database wordpress e stampando a video i risultati tramite un comun mysql_fetch_array...

    Tuttavia avrei bisogno di una funzione di ricerca anche all'interno di altre pagine (ad esempio, correlazioni tra post tramite i custom_meta_tag), in questo modo dovrei riuscire però a quel punto di wordpress rimarrebbe poco e niente...