I've written a custom theme. It's pretty complex so I won't post a huge code block here for everyone's sanity.
In my functions.php
file I have the following hook being called:
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');
What happens on my wordpress website when my theme is activated is that no scripts get added to the search.php
page but they do get added to the 404.php
page which is very odd! In fact, not even killing the page works with die();
if( is_search() ){
die('it works');
}
This leads me to think that the condition is never being met within the hook override for wp_enqueue_scripts
. I'm not sure if this is a bug, or if my logic is just incorrect and I'm calling the wrong functions. What else can I try to make my logic work?
Thanks
Edit:
Okay an update: I just tried the above code in another theme and it DOES do what it's supposed to! I guess the question I should now be asking is what can I do to ensure is_search()
returns true
? So far I've disabled all plugins and removed a query_posts()
call from index.php, but still facing issues :(
Edit #2: After 9 hours of debugging this (sigh) I've finally found what's causing the problem (but no solution to it - yet!)
I created a test wordpress site and copied over my custom theme files. I deleted them one by one until I had the bare minimum files needed for a theme and that's when I found out what was causing the problem. It seems having a header.php
file makes is_search()
return false
. Very strange!
As you can see from the screenshots above, as soon as I delete the header.php file everything is fine as is_search()
returns true.
What on earth could be causing this very strange issue? I have other themes with a header.php file in them and they work fine...
I'm going to continue to play around with this but here are my source files just in case:
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:
Here is the output of $wp_query
also
Edit #4: Time for bed now so I guess I'll have another shot at this tomorrow. Here's the theme files just in case anyone is interested: ;usp=sharing
I've written a custom theme. It's pretty complex so I won't post a huge code block here for everyone's sanity.
In my functions.php
file I have the following hook being called:
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');
What happens on my wordpress website when my theme is activated is that no scripts get added to the search.php
page but they do get added to the 404.php
page which is very odd! In fact, not even killing the page works with die();
if( is_search() ){
die('it works');
}
This leads me to think that the condition is never being met within the hook override for wp_enqueue_scripts
. I'm not sure if this is a bug, or if my logic is just incorrect and I'm calling the wrong functions. What else can I try to make my logic work?
Thanks
Edit:
Okay an update: I just tried the above code in another theme and it DOES do what it's supposed to! I guess the question I should now be asking is what can I do to ensure is_search()
returns true
? So far I've disabled all plugins and removed a query_posts()
call from index.php, but still facing issues :(
Edit #2: After 9 hours of debugging this (sigh) I've finally found what's causing the problem (but no solution to it - yet!)
I created a test wordpress site and copied over my custom theme files. I deleted them one by one until I had the bare minimum files needed for a theme and that's when I found out what was causing the problem. It seems having a header.php
file makes is_search()
return false
. Very strange!
As you can see from the screenshots above, as soon as I delete the header.php file everything is fine as is_search()
returns true.
What on earth could be causing this very strange issue? I have other themes with a header.php file in them and they work fine...
I'm going to continue to play around with this but here are my source files just in case:
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:
Here is the output of $wp_query
also http://pastebin/Z0DwDd20
Edit #4: Time for bed now so I guess I'll have another shot at this tomorrow. Here's the theme files just in case anyone is interested: https://drive.google/folderview?id=0B1zYR-LjR-j9NFV2ZXg3V0NJblk&usp=sharing
When using wp_enqueue_script
, you probably passing true
for in_footer
parameter. If so, then check that your search.php
is calling get_footer()
function at the bottom.
As a partial answer to your question, I can explain your confusion over deleting the header file. The wp_enqueue_scripts
hook is fired in the wp_head()
, which must be in your header.php
file. Your dummy header file doesn't include this, so the entire DA_script_enqueue
function isn't running at all. When you delete the header.php file, WordPress uses a default instead, which does include wp_head
.
For your original problem you'll need to go back to square one and debug things a bit at a time, but without losing the wp_head()
function.
The var_dump
from the main query is fine, is_search()
returns true as it should. Also, the SQL query look fine for a search page.
This further deepens my suspicion that something is altering the main query right after it is successfully executed, and this happens most probably before wp_enqueue_scripts
.
The most probable culprit here is query_posts
. I can remember a while ago that someone had such an issue which turned out to be YOAST plugin (IIRC) which used query_posts
or some bad filter or something, and the issue was solved by deactivating the plugin.
Your best place to start here would be to search your theme for query_posts
and sort that out if there is any instances of query_posts
. If it is not in a theme, you'll need to look into your plugins. Deactivate your plugins one by one and test after each one has being deactivated. You should be able to find the culprit with this method
Try resetting the main query on wp_enqueue_scripts
and then check if your styles and scripts are enqueued from your action. If so, that means that is_search()
returns true, which 99.9% confirms the use of query_posts
somewhere in your theme or plugin.
NOTE: This is just a test and not a solution.
add_action( 'wp_enqueue_scripts', function ()
{
wp_reset_query();
}, 9 );
I just realised that you have already deactivated all plugins. As you have stated, when you delete header.php
, your results is ok.
Debugging
Unfortunately, the files you linked to does not help as it is basicly just all the themes in you themes folder, but here is some basic debug info
Code editors has quite good search functions which you can use to search for spefific strings inside all files within your theme. I would start by searching for all instances of query_posts
, specially inside your functions files as it seems like the issue is caused by something hooked to an action hook which resides in the header or is actually hooked to wp_head
header.php
houses the wp_head()
function which is just a wrapper for the wp_head
action. There are many action hooks (like wp_enqueue_scripts
) hooked to wp_head
. Check this post in order to get a list of everything hooked to wp_head
. As a quick debugging check to check if the issue is caused by anything hooked to wp_head
before going on a wild goose chase, simply delete wp_head()
and check the is_search()
condition. Obviously, if is_search()
return true then, something hooked to wp_head
is causing the issue.
header.php
also houses functions like navigations menus, and most of these functions are filterable to filters. It might be that there is a bad filter that is used by one of these functions. If the above two bullet points where fruitless, delete these functions one by one to determine the bad apple. nce you have the bad apple, it is as easy as looking at the source code to determine which filters it uses and then looking for these custom filters in your theme's function files
query_posts
somewhere on your search page. It is the most probable cause whyis_search()
would return false on the search page – Pieter Goosen Commented Feb 18, 2016 at 10:58search.php
file but thedie('it works');
still doesn't get executed. Any other ideas? – Joel Murphy Commented Feb 18, 2016 at 11:47var_dump( $wp_query );
on your searh page and inspects the query object. It should tell you what is going on – Pieter Goosen Commented Feb 18, 2016 at 11:58wp_head()
in yourheader.php
file grab print the WP_Query as Pieter suggested and put it here ( or in a pastebin ) -global $wp_query; print_r( $wp_query ); die();
This may bring some insight. – Howdy_McGee ♦ Commented Feb 18, 2016 at 21:50