2

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

    src
     '-- SamplePlugin
     '   '-- ShortCode.php
     '-- autoload.php
    sample-plugin.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

2

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.

Update

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

<?php
/**
 * 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:

<?php
/**
 * 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';
2
  • Hey, I did try working with absolute paths already. All it does is changing the paths in the error output. Dec 18, 2015 at 8:22
  • I just tested your plugin structure and this modification works on my install. @PascaleBeier
    – birgire
    Dec 18, 2015 at 10:02

Your Answer

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

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