I'm struggling with spl_autoloading inside a namespaced WordPress Plugin.

I already revised these questions:

My folder structure looks like that:

Namespacing everything below SamplePlugin

inside wp-content/plugins/sample-plugin

     '-- SamplePlugin
     '   '-- ShortCode.php
     '-- autoload.php

My current autoload function (as I'm used to doing it...)

spl_autoload_register(function ($class) {

$dir = 'src/';
$file = str_replace('\\', '/', $class) . '.php';

require_once $dir . $file;

Using that, the prefixing namespace is correctly added, so if I instantiate in sample-plugin.php:

namespace SamplePlugin;
require_once 'src/autoload.php';

$shortcode = new ShortCode();

I get the following output (VVV):

Warning: require_once(src/SamplePlugin/ShortCode.php): failed to open stream: No such file or directory in /srv/www/wordpress-default/wp-content/plugins/sample-plugin/src/autoload.php on line 8

Fatal error: require_once(): Failed opening required 'src/SamplePlugin/ShortCode.php' (include_path='.:/usr/share/php:/usr/share/pear') in /srv/www/wordpress-default/wp-content/plugins/sample-plugin/src/autoload.php on line 8

Any hints?

All Classes (e.g. ShortCode are callable through SamplePlugin\Shortcode.

1 Answer 1


I think the problem here is that you're using a relative path in autoload.php inside the src/ subfolder,

Try for example to modify your src/autoload.php to use absolute paths instead:

\spl_autoload_register( function( $class )
    $dir = plugin_dir_path( __FILE__ );

    $file = str_replace( '\\', '/', $class ) . '.php';

    $path = $dir . $file;

    if( file_exists( $path ) )
        require_once $path;

} );

where we add a file_exists to be plugin class specific.


Here's the main /sample-plugin/sample-plugin.php file:

 * Plugin Name: Sample Plugin

namespace SamplePlugin;

require_once __DIR__ . '/src/autoload.php';
// require_once 'src/autoload.php';

$shortcode = new ShortCode();

Here's the /simple-plugin/src/SamplePlugin/Shortcode.php file:

 * Class Shortcode

namespace SamplePlugin;

class Shortcode
    public function __construct()
        print 'DEBUG: Greetings from the Shortcode instance!';

You could also check out how Composer generates the vendor/autoload.php file, that's included with:

require __DIR__ . '/vendor/autoload.php';
  • Hey, I did try working with absolute paths already. All it does is changing the paths in the error output. Commented Dec 18, 2015 at 8:22
  • I just tested your plugin structure and this modification works on my install. @PascaleBeier
    – birgire
    Commented Dec 18, 2015 at 10:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.