Неустранимая ошибка: класс 'WC_Settings_Page' не найден при использовании пространства имен - PullRequest
0 голосов
/ 10 апреля 2020

У меня странная проблема с расширением WC_Settings_Page. Я хочу использовать его, чтобы добавить вкладку настроек (и некоторые разделы внутри нее в разделах настроек Woocommerce.

Мой плагин основан на OOP, и у всех моих файлов есть связанное пространство имен. У меня есть основной класс, который что-то вроде этого в следующем (если вам нужно увидеть полную структуру, вы можете найти ее в моем github репо:

<?php
/**
 * The file that defines the core plugin class
 *
 * A class definition that includes attributes and functions used across both the
 * public-facing side of the site and the admin area.
 *
 * @package    Siawood_Products
 * @author     Mehdi Soltani Neshan <soltani.n.mehdi@gmail.com>
 * @license    https://www.gnu.org/licenses/gpl-3.0.txt GNU/GPLv3
 * @link       https://wpwebmaster.ir
 * @since      1.0.0
 */

namespace Siawood_Products\Includes\Init;

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}
/* Some uses is hear */
use Siawood_Products\Includes\Admin\WC_Siawood_Setting_Tab1;
class Core implements Action_Hook_Interface, Filter_Hook_Interface {
/*constructor of class and other things is here.....*/

    public function init_core() {
            /* FYI: I checked before is woocommerce is active or not, if active, I call init_core() */
            add_action( 'plugins_loaded', [ $this, 'add_setting_page' ] );
    }

    public function add_setting_page(  ) {
        new WC_Siawood_Setting_Tab1();
    }

}

Чтобы убедиться, что плагин Woocommerce загружен, поэтому я можно использовать из woocommerce_loaded hook (также я проверил это с init, но результаты были такими же.

И WC_Siawood_Setting_Tab1 класс:

<?php
/**
 * WC_Siawood_Setting_Tab Class File
 *
 * This file creates admin setting tab for this plugin
 *
 * @package    Siawood_Products
 * @author     Mehdi Soltani Neshan <soltani.n.mehdi@gmail.com>
 * @license    https://www.gnu.org/licenses/gpl-3.0.txt GNU/GPLv3
 * @link       https://wpwebmaster.ir
 * @since      1.0.1
 */
namespace Siawood_Products\Includes\Admin;

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * WC_Siawood_Setting_Tab Class File
 *
 * This file creates admin setting tab for this plugin
 *
 * @package    Siawood_Products
 * @author     Mehdi Soltani Neshan <soltani.n.mehdi@gmail.com>
 * @link       https://wpwebmaster.ir
 *
 */
class WC_Siawood_Setting_Tab1 extends \WC_Settings_Page {


    /**
     * Constructor.
     *
     * @version 1.3.0
     * @since   1.0.0
     */
    function __construct() {
        $this->id    = 'my_settings';
        $this->label = __( 'my label', 'my-textdomain-woocommerce' );
        parent::__construct();

    }
}




Так что, когда я запускаю мой плагин и вызов метода init_core(), я получил эту ошибку:

Неустранимая ошибка: класс 'WC_Settings_Page' не найден в ... \ wp-content \ plugins \ siawood-products \ includes \ admin \ class-w c -siawood-setting-tab1. php в строке 29

Странно, потому что я подключил его к woocommerce_loaded или plugin_loaded, пока он не сможет загружаться после загрузки Woocommerce, но это не работает.

Как я могу решить это?

1 Ответ

1 голос
/ 11 апреля 2020

Вместо инициализации класса на plugins_loaded я бы сделал следующее:

    public function init_core() {
        add_filter( 'woocommerce_get_settings_pages', [ $this, 'add_setting_page' ] );
    }

    public function add_setting_page( $settings ) {
        $settings[] = include_once path_to_your_file .  '/class-wc-siawood_setting_tab1 .php'
        return $settings;
    }

Для полноты:

    use Siawood_Products\Includes\Admin\WC_Siawood_Setting_Tab1;
    class Core implements Action_Hook_Interface, Filter_Hook_Interface {
    /*constructor of class and other things is here.....*/

        public function init_core() {
                add_action( 'woocommerce_get_settings_pages', [ $this, 'add_setting_page' ] );
        }

        public function add_setting_page(  ) {
            $settings[] = include_once $path_to_your_file .  '/class-wc-siawood_setting_tab1 .php'
            return $settings;
        }

    }

и в вашем другом файле класса класс должен инициализировать сам себя

    namespace Siawood_Products\Includes\Admin;

    if ( ! defined( 'ABSPATH' ) ) {
        exit;
    }

    class WC_Siawood_Setting_Tab1 extends \WC_Settings_Page {


        /**
         * Constructor.
         *
         * @version 1.3.0
         * @since   1.0.0
         */
        function __construct() {
            $this->id    = 'my_settings';
            $this->label = __( 'my label', 'my-textdomain-woocommerce' );
            parent::__construct();

        }
    }

    return new WC_Siawood_Setting_Tab1();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...