web-dev-qa-db-fra.com

Changer le fichier loop.php pour une personnalisation de recherche vide

Cela fait des jours que je suis perplexe de me demander pourquoi, lorsque je soumets une chaîne vide en tant que terme de recherche, le message est redirigé vers une partie de loop.php où le code suivant est inséré:

<?php /* If there are no posts to display, such as an empty archive page */ ?>
<?php if ( !(have_posts()) && !(is_search()) ) : ?>
    <h1 class="notfound-header"><?php _e( 'Not Found', 'twentyten' ); ?></h1>
    <p class="notfound-content"><?php _e( 'Apologies, but no results were found.', 'twentyten' ); ?></p>
<?php elseif ( !(have_posts()) && (is_search()) ): ?>
    <h1 class="notfound-header-search"><?php _e( 'Not Found Search', 'twentyten' ); ?></h1>
    <p class="notfound-content-search"><?php _e( 'Apologies, but no results were found.', 'twentyten' ); ?></p>
    <?php get_search_form(); ?>
<?php endif; ?>

Je n'inclus probablement pas la is_search() correctement. Mais je travaille sur ce site: http://www.cirkut.net/wp/libertyguide et je souhaite afficher le formulaire de recherche lorsque rien est soumis (c.-à-d. en cliquant simplement sur la recherche dans la page d'accueil).

Des idées sur quoi faire? Merci pour toute aide!

1
Josh Allen

Je me sens mal de répondre à ma propre question ici, mais voici ce que j'ai fait.

J'ai créé un modèle de recherche personnalisé, un searchform.php personnalisé et modifié mon header.php pour refléter ma page de recherche personnalisée.

Ce que j’ai fait, c’est de renommer les noms des champs de recherche en search au lieu de s afin de contourner WordPress automatiquement en exécutant search.php et en générant une erreur 404 (toujours incertain de la cause, probablement de ma faute dans search.php), puis en utilisant un nouveau WP_Query lors de la définition. mes arguments. Bien que ma solution ne fournisse rien de plus qu'un terme de recherche, elle pourrait facilement être implémentée pour extraire d'autres paires clé-valeur dans le tableau d'arguments.

searchform.php

<div class="search">
    <form method="get" class="search-form" id="search-form" action="<?php bloginfo( 'url' ); ?>/search/">
    <div>
        <input class="search-text" type="text" name="search" id="search-text" value="Search this site" />
        <input class="search-submit" type="submit" name="submit" id="search-submit" value="Search" />
    </div>
    </form>
</div>

extrait de recherche-template.php

$s = wp_specialchars(stripslashes($_GET["search"]), 1);
$search_query = array(
    's' => $s
);

$search = new WP_Query($search_query);

Donc, s est maintenant search pour contourner WordPress automatiquement en utilisant search.php.

Si quelqu'un a des questions, n'hésitez pas à poster un commentaire.

3
Josh Allen

Lorsque vous effectuez une recherche avec une chaîne vide, WordPress ne fera pas de recherche et votre page de recherche ne sera donc pas utilisée. Dans le $wp_query, un paramètre, simplement nommé s, représente le terme recherché. Si elle a la valeur '', WordPress ne la renvoie pas à la page de recherche.

Quant à savoir comment vous pouvez diriger ceci vers la page de recherche vide, je ne suis pas sûr. Je sais que vous pouvez utiliser pre_get_posts pour définir le paramètre s, mais il s’agit probablement d’une solution très compliquée, de sorte que d’autres pourront éventuellement vous aider.

2
tollmanz

j'ai trouvé une solution de contournement jquery/facile sur http://wpengineer.com/2162/fix-empty-searches/ , empêchant de soumettre si le champ est vide:

/**
 * Stop empty searches
 *
 * @author Thomas Scholz http://toscho.de
 * @param  $ jQuery object
 * @return bool|object
 */
(function( $ ) {
   $.fn.preventEmptySubmit = function( options ) {
       var settings = {
           inputselector: "#s",
           msg          : "Don’t waste your time with an empty search!"
       };
       if ( options ) {
           $.extend( settings, options );
       };
       this.submit( function() {
           var s = $( this ).find( settings.inputselector );
           if ( ! s.val() ) {
               alert( settings.msg );
               s.focus();
               return false;
           }
           return true;
       });
       return this;
   };
})( jQuery );

Et en charge:

jQuery( "#searchform" ).preventEmptySubmit();

(Cette solution affiche également une alerte, mais je préfère la désactiver - et rester concentré sur le champ de recherche ...)

1
ptriek