web-dev-qa-db-fra.com

wp_enqueue_scripts non appelé sur la page de recherche?

J'ai écrit un thème personnalisé. C'est assez complexe donc je ne posterai pas un bloc de code énorme pour la santé mentale de tout le monde.

Dans mon fichier functions.php, le hook suivant est appelé:

function DA_script_enqueue() {
    if( is_404() ){ 
        //load scripts with wp_enqueue_script() 
    }
    if( is_search() ){ 
        //load scripts with wp_enqueue_script() 
    }
}
add_action( 'wp_enqueue_scripts', 'DA_script_enqueue');

Lorsque mon thème est activé, ce qui se passe sur mon site wordpress, c’est qu’aucun script n’a été ajouté à la page search.php, mais ils sont ajoutés à la page 404.php, ce qui est très étrange! En fait, ne même pas tuer la page fonctionne avec die();

if( is_search() ){ 
   die('it works');
}

Cela me porte à penser que la condition n'est jamais remplie dans la substitution de hook pour wp_enqueue_scripts. Je ne sais pas s'il s'agit d'un bogue ou si ma logique est tout simplement incorrecte et si j'appelle les mauvaises fonctions. Que puis-je essayer de faire fonctionner ma logique?

Merci

Edit: Ok, une mise à jour: je viens d'essayer le code ci-dessus dans un autre thème et il FAIT fait ce qu'il est censé faire! Je suppose que la question que je devrais maintenant poser est la suivante: que puis-je faire pour m'assurer que is_search() renvoie true? Jusqu'à présent, j'ai désactivé tous les plugins et supprimé un appel query_posts() de index.php, mais je rencontrais toujours des problèmes :(

Éditer # 2: Après 9 heures de débogage, ce ( soupir ) a finalement trouvé la cause du problème (mais pas de solution) - encore!)

J'ai créé un site de test wordpress et copié sur mes fichiers de thème personnalisés. Je les ai supprimés un par un jusqu'à ce que je dispose du minimum de fichiers nécessaire pour un thème et c'est à ce moment-là que j'ai découvert la cause du problème. Il semble que le fait d'avoir un fichier header.php rend is_search() return false. Très étrange!

enter image description here

enter image description here

enter image description here

Comme vous pouvez le constater à partir des captures d'écran ci-dessus, dès que je supprime le fichier header.php, tout va bien, car is_search() renvoie true.

Qu'est-ce qui pourrait causer ce problème très étrange? J'ai d'autres thèmes avec un fichier header.php et ils fonctionnent bien ...

Je vais continuer à jouer avec cela, mais voici mes fichiers source au cas où:

search.php:

<?php get_header(); ?>

search page

<?php get_footer(); ?>

functions.php:

<?php
        // This function will load certain scripts on certain pages - saving on bandwidth and server resourses.
    function init_scripts()
    {
        if ( is_search() ) {
            die('Yes this is the search page loading from the init_scripts function');
        }
    }
    add_action( 'wp_enqueue_scripts', 'init_scripts' );
?>

header.php:

header

Edit # 3: Voici le résultat de $wp_query également http://Pastebin.com/Z0DwDd20

Edit # 4: Il est temps d'aller au lit maintenant, alors j'imagine que je vais avoir un autre coup pour ça demain. Voici les fichiers de thème au cas où quelqu'un serait intéressé: https://drive.google.com/folderview?id=0B1zYR-LjR-j9NFV2ZXg3V0NJblk&usp=sharing

1
Joel Murphy

Le var_dump de la requête principale est correct, is_search() renvoie true comme il se doit. En outre, la requête SQL semble bien pour une page de recherche.

Cela approfondit encore mes soupçons sur le fait que quelque chose altère la requête principale juste après son exécution réussie, et cela se produit probablement avant wp_enqueue_scripts.

Le coupable le plus probable ici est query_posts. Je me souviens il y a quelque temps que quelqu'un avait un problème qui se révélait être un plug-in YOAST (IIRC) qui utilisait query_posts ou un filtre incorrect ou quelque chose du genre, et le problème a été résolu par désactiver le plugin.

Votre meilleur endroit pour commencer ici serait de rechercher query_posts dans votre thème et de le trier s'il existe des occurrences de query_posts. Si ce n'est pas dans un thème, vous devrez regarder dans vos plugins. Désactivez vos plugins un par un et testez-les après la désactivation de chacun. Vous devriez pouvoir trouver le coupable avec cette méthode

MODIFIER

Essayez de réinitialiser la requête principale sur wp_enqueue_scripts, puis vérifiez si vos styles et scripts sont mis en file d'attente à partir de votre action. Si tel est le cas, cela signifie que is_search() renvoie true, ce qui confirme 99,9% de l'utilisation de query_posts quelque part dans votre thème ou plug-in.

NOTE: Ceci est juste un test et pas une solution .

add_action( 'wp_enqueue_scripts', function ()
{
    wp_reset_query();
}, 9 );

EDIT 2

Je viens de me rendre compte que vous avez déjà désactivé tous les plugins. Comme vous l'avez dit, lorsque vous supprimez header.php, vos résultats sont corrects.

Débogage

Malheureusement, les fichiers que vous avez liés n’aident pas car il s’agit en gros de tous les thèmes de votre dossier de thèmes, mais voici quelques informations de débogage de base.

  • Les éditeurs de code disposent de fonctionnalités de recherche très utiles que vous pouvez utiliser pour rechercher des chaînes spécifiques dans tous les fichiers de votre thème. Je commencerais par rechercher toutes les instances de query_posts, spécialement dans vos fichiers de fonctions, car il semble que le problème soit causé par quelque chose qui est accroché à un crochet d’action qui réside dans l’en-tête ou qui est réellement accroché à wp_head.

  • header.php contient la fonction wp_head() qui n'est qu'un wrapper pour l'action wp_head. Il existe de nombreux crochets d’action ( tels que wp_enqueue_scripts) reliés à wp_head. Vérifiez ce message afin d’obtenir une liste de tout ce qui est relié à wp_head. Pour vérifier rapidement si le problème est causé par un élément lié à wp_head avant de lancer une poursuite effrénée, supprimez simplement wp_head() et vérifiez la condition is_search(). Évidemment, si is_search() renvoie true, un problème lié à wp_head est à l'origine du problème.

  • header.php contient également des fonctions telles que les menus de navigation. La plupart de ces fonctions peuvent être filtrées en filtres. Il se peut qu’un filtre défectueux soit utilisé par l’une de ces fonctions. Si les deux points ci-dessus ont été infructueux, supprimez ces fonctions une par une pour déterminer la mauvaise pomme. Lorsque vous avez la mauvaise pomme, il suffit de consulter le code source pour déterminer les filtres qu’elle utilise, puis de rechercher ces filtres personnalisés dans les fichiers de fonction de votre thème.

1
Pieter Goosen

En réponse partielle à votre question, je peux expliquer votre confusion quant à la suppression du fichier d’en-tête. Le hook wp_enqueue_scripts est lancé dans la wp_head(), qui doit être dans votre fichier header.php. Votre fichier d'en-tête factice n'inclut pas cela, donc la fonction DA_script_enqueue entière ne s'exécute pas du tout. Lorsque vous supprimez le fichier header.php, WordPress utilise à la place une valeur par défaut, qui inclut wp_head.

Pour votre problème initial, vous devrez revenir à la case départ et déboguer les choses un à un, mais sans perdre la fonction wp_head().

0
Stephen

Lorsque vous utilisez wp_enqueue_script, vous passez probablement true pour le paramètre in_footer. Si tel est le cas, vérifiez que votre search.php appelle la fonction get_footer() en bas.

0
bedman