web-dev-qa-db-fra.com

Comment puis-je paginer les résultats de la recherche pour les types de publication personnalisés?

J'ai un type de message personnalisé appelé "voitures" qui stocke plusieurs champs personnalisés avec les champs standard Titre/Description. J'ai besoin que les utilisateurs puissent rechercher dans le CPT en fonction des champs personnalisés correspondant aux critères de l'utilisateur. J'ai compris cette partie et ça marche, mais le problème est la pagination. J'ai trouvé comment paginer le CPT en fonction du code trouvé sur Google, et cela fonctionne, mais une fois que vous avez quitté la page 1, vous n'avez plus les données de recherche soumises avec le formulaire. J'ai juste besoin de savoir comment je devrais la stocker ou la transmettre.

Dans PHP, je voudrais simplement utiliser une session pour stocker les données, mais on m'a dit de ne pas le faire avec Wordpress. Alors, quelle est la meilleure option? On m'a dit que les transitoires étaient la version WP des sessions, mais je ne savais pas comment les utiliser efficacement pour cela ni comment les conserver séparément pour chaque utilisateur.

Je ne demande à personne d'écrire ceci pour moi - j'ai juste besoin d'aide pour comprendre le meilleur concept pour cela.

5
kcarter609

Au lieu d'implémenter une requête de recherche personnalisée, incluez plutôt les champs personnalisés dans la recherche standard et utilisez les règles de réécriture pour mapper /?post_type=cars&s=mysearchterm à /search/cars/mysearchterm. Ou utilisez simplement les vars de requête dans l'URL plutôt que POST/$_POST ou des données transitoires. GET/$_GET est votre ami ici.

Les transitoires sont conçus pour stocker temporairement des données plutôt que de les recalculer, par ex. Les flux RSS et autres éléments coûteux à calculer et qui peuvent ne pas avoir une durée de vie permanente. Ils ne remplacent pas les sessions (vous ne devriez pas non plus avoir besoin de sessions ou d'un autre analogue).

Cela devrait vous montrer comment regrouper les champs personnalisés dans la recherche:

http://stv.whtly.com/2010/03/15/extend-wordpress-search-to-include-custom-post-meta/

Testez avec $wp->query_vars['s'] ou get_query_var( 's' ) pour voir si votre requête de recherche correspond à votre type de publication afin que vous puissiez ensuite inclure conditionnellement les bits de méta-recherche personnalisés.

crédits: merci kaiser pour le conseil get_query_var

6
Tom J Nowell

Tout comme @TomJNowellanswer .

Avec votre recherche, utilisez $_GET au lieu de $_POST pour votre requête de recherche. Vos variables de recherche continueront de page en page dans l'URL de votre pagination personnalisée.

Utiliser $_GET est potentiellement demander une faille de sécurité. Assurez-vous de valider ou de désinfecter vos variables. WordPress a beaucoup de documentation sur Validation des données . Sinon, lisez le manuel PHP pour plus de méthodes de Validation ou Sanitization .

En ce qui concerne votre pagination personnalisée, je vous recommande de définir une variable supplémentaire dans votre URL. Je suis sûr que votre pagination personnalisée définit déjà un numéro de page. Vous pouvez donc obtenir le numéro de page à partir de votre URL (par exemple, $_GET['page']) et ajuster le décalage de votre requête pour les résultats de la recherche.

Hypothétiquement, supposons que vous disposiez d'une pagination conviviale pour les URL, ainsi que de la configuration suivante.

$number_posts = 10;// Numer of search results to display per page.
$current_page = $_SERVER['REQUEST_URI'];// Will return the current page values of your URL.
$sub_page = '/page/';// Current pagination page.
$using_pagination = strpos($current_page, $sub_page);// Check for paginated content.
if($using_pagination === false){
    /* Not using the pagination, get $number_posts with no offset. */
} else{
    $page_number = explode('/page/', $current_page);// Locate just the sub-page from the URL.
    $page_number = preg_replace('/\D/', '', $page_number[1]);// Get only the sub-page number from the URL.
    if(is_numeric($page_number)){
        /* Set the correct offset number, based on the number of search results to display. */
        $offset = ($page_number - 1) * $number_posts;
    }
    /* Using the pagination, get $number_posts, with an offset of $offset. */
}

Vous pouvez utiliser le code ci-dessus pour votre pagination personnalisée afin de renvoyer les résultats de recherche appropriés. Remarque: N'oubliez pas que vous devez bien sûr extraire les variables de recherche de l'URL pour interroger correctement les résultats de la recherche.

1
Michael Ecklund