Fatal error: Uncaught Error: Call to undefined function Timmy\add_action()
njbarrett opened this issue · 4 comments
Hey guys,
Love your work. I'm having trouble getting Timmy working on my installation.
I have installed Timmy and Timber both via Composer, the latest versions of both.
In function.php I have the autoloader set, however it seems Timmy is loaded before the wp functions are available?
Here's the full error:
( ! ) Fatal error: Uncaught Error: Call to undefined function Timmy\add_action() in /Users/nick/Sites/xx/vendor/mindkomm/timmy/lib/Timmy.php on line 19
( ! ) Error: Call to undefined function Timmy\add_action() in /Users/nick/Sites/xx/vendor/mindkomm/timmy/lib/Timmy.php on line 19
Call Stack
# Time Memory Function Location
1 0.0001 370528 {main}( ) .../index.php:0
2 0.0001 370816 require( '/Users/nick/Sites/xx/www/wp/wp-blog-header.php' ) .../index.php:5
3 0.0001 371168 require_once( '/Users/nick/Sites/xx/www/wp/wp-load.php' ) .../wp-blog-header.php:13
4 0.0002 371944 require_once( '/Users/nick/Sites/xx/www/wp-config.php' ) .../wp-load.php:42
5 0.0002 373712 require_once( '/Users/nick/Sites/xx/vendor/autoload.php' ) .../wp-config.php:7
6 0.0004 389808 ComposerAutoloaderInit89b2a1fa8ec074114b3ea6f13e74d114::getLoader( ) .../autoload.php:7
7 0.0015 579048 composerRequire89b2a1fa8ec074114b3ea6f13e74d114( ) .../autoload_real.php:56
8 0.0015 579720 require( '/Users/nick/Sites/xx/vendor/mindkomm/timmy/init.php' ) .../autoload_real.php:66
9 0.0021 667432 Timmy\Timmy->__construct( ) .../init.php:7
10 0.0028 780264 Timmy\Timmy->init( ) .../Timmy.php:13
Hey @njbarrett
It seems like PHP is trying to call the function add_action()
in Timmy’s namespace (Timmy\add_action()
) instead of the global namespace, where all the functions of WordPress are. Timmy waits for WordPress to be loaded and hooks into the after_setup_theme
action. The easiest solution would of course be to prefix all global functions that Timmy calls with a \
, but I’d like to understand what’s going on. I suspect the problem lies somewhere else.
- What version of PHP are you using?
- Where did you install Timber and Timmy? Did you install it inside the theme or the in the root of your WordPress installation.
- Do you use the default WordPress installation/folder structure or a custom one (like Bedrock, for example)? From the call stack I see that your Composer libraries lie in
vendor/
, while WordPress is installed inwww/wp/
?
I'm having the same issue
Using PHP version 7.1
TImmy is installed in vendor folder in root directory
by using bedrock as a custom folder structure
with sage9 as a starter theme
Okay. I will install Bedrock and look at this more closely.
Alright. The problem was that Composer loaded init.php
, which automatically initialized Timmy. Usually, when Timmy was installed in a theme, a developer would manually require vendor/autoload.php
in functions.php and Timmy would initialize after WordPress was loaded. With Bedrock, Composer initializes earlier, when WordPress is not loaded yet. The workaround for this is to always initialize Timmy manually.
With the new version 0.12.1 you need to manually initialize Timmy in functions.php of your theme with:
new Timmy\Timmy();
You can add this right after you called new Timber\Timber();
.
Thanks for raising this issue. I think this way Timmy will work in most "special" environments. Initializing Timmy automatically maybe was a good idea when I introduced it. I learnt a lot in the meantime and I think this change is the better way to do it 😊.
I’m closing this for now. In case it shouldn’t work, add your comments here.