Плагин WordPress require_once file – не может использовать функции WordPress

Вопрос или проблема

Я много читал о require_once на Stack Overflow.

Но ни один ответ не решил мою проблему.

У меня есть плагин с двумя файлами.

dmd_main.php //основной файл

dmd_second.php //некоторые функции WP

В основном файле я включил эту строку:

require_once (plugin_dir_path(__FILE__) . 'includes/dmd_second.php');

Но во втором файле я все равно получаю сообщение об ошибке:

Call to undefined function get_option()

Я читал, что это правильный способ работы с функциями WordPress, не так ли?

Я перепробовал многое, и этот код сработает, если я включу его во второй файл:

include_once($_SERVER['DOCUMENT_ROOT'].'wp-config.php' );

Но это решение действительно плохое.

Может кто-нибудь объяснить мне, как я могу решить эту проблему?

ИЗМЕНИТЬ:

Код из основного файла:

<?php
/**
 * Название плагина: dmd Pages
 *  
 * @package dmd_Pages
 *
 * @wordpress-plugin
 * URI плагина: https://dimadirekt.de/
 * Автор: digitalmarketingditrekt gmbh
 * URI автора: https://dimadirekt.de/
 * Описание: Этот плагин загружает список всех опубликованных страниц в меню в админ панели. Вы можете редактировать страницы быстрее и не нужно искать их в панели инструментов => страницы.
 * Версия: 1.
 **/

class dmd_pages{
    public function __construct(){ 
        require_once (plugin_dir_path(__FILE__) . 'includes/saveData.php');
        $this->set_actions();
    }

    public function set_actions(){
        add_action( 'admin_enqueue_scripts', array($this, 'dmd_custom_style_load'), 99 ); 
        add_action( 'wp_enqueue_scripts', array($this, 'dmd_enqueue_child_theme_styles'), 99);
        add_action( 'admin_menu', array($this, 'dmd_register_adminmenu'));
        add_action( 'wp_before_admin_bar_render', array($this, 'dmdPages'));
    }  

    /*
     * Загрузить стиль для меню в административной панели
     */
    public function dmd_custom_style_load() {
        wp_register_style( 'dmd-pages-css-admin', plugins_url('./css/style.css',  __FILE__));
        wp_enqueue_style( 'dmd-pages-css-admin' );
        wp_enqueue_script( 'searchbox', plugins_url('./js/jquery.hideseek.min.js', __FILE__), true);
        wp_enqueue_script( 'liveAjax', plugins_url('./js/liveAjax.js', __FILE__), true);
    }

    public function dmd_enqueue_child_theme_styles() {
        wp_register_style( 'dmd-pages-css-fe', plugins_url( './css/style.css', __FILE__ ) );
        wp_enqueue_style( 'dmd-pages-css-fe' );                         
        wp_enqueue_script( 'searchbox', plugins_url('./js/jquery.hideseek.min.js', __FILE__), true);
        wp_enqueue_script( 'liveAjax', plugins_url('./js/liveAjax.js', __FILE__), true);
    } 

    /*
     * Создать новое меню
     */
    public function dmd_register_adminmenu() {
        add_menu_page( 'DMD Pages', 'DMD Pages', 'manage_options', '/dmd-pages/admin-tpl.php', '');
    }  

    public function dmd_get_status_option(){
        $status = explode(",", get_option('dmd-pages-settings'));

        return $status;
    }

     public function dmdPages() {

        if ( !is_super_admin() || !is_admin_bar_showing() )
                return; 

         global $wpdb;
         global $wp_admin_bar;

        /* 
         * получить все посты 
         */
                $option = $this->dmd_get_status_option();

                $querystring = 'SELECT ID, post_title, post_type FROM '.$wpdb->prefix.'posts WHERE 1=1 AND 1=2 ';

                if($option[0] == 1){
                    $querystring .= 'UNION SELECT ID, post_title, post_type FROM '.$wpdb->prefix.'posts WHERE post_status="publish" AND post_type="post"';
                }

                if($option[1] == 1){
                    $querystring .= 'UNION SELECT ID, post_title, post_type FROM '.$wpdb->prefix.'posts WHERE post_status="publish" AND post_type="page"';
                }

                if($option[3] == 1){
                    $querystring .= 'UNION SELECT id, name as post_title, default_template as post_type FROM '.$wpdb->prefix.'frm_forms WHERE status = "published" ORDER BY post_title ASC';
                }

                $results = $wpdb->get_results($querystring);        

        /*
         * Создать новое меню в админ панели 
         */
            $wp_admin_bar->add_node(array(
                    'id'    => 'FastMenu',
                    'title' => 'FastMenu'
            ));

                if($option[2] == 1){
                    $wp_admin_bar->add_node( array(
                        'id'    => 'live-search',
                        'title' => 'live search',
                        'parent'=>'FastMenu',
                        'meta'=> array( 'html' => '<input type="text" name="search" class="search tt-query" data-list=".searchclass">','target' => '_blank', 'class' => 'dmd_livesearch' ) 
                    ));             
                }
        /*
         * Создать подменю в админ панели
         */

        if(isset($results))
         {  
            foreach ($results as $post){
                $site = admin_url();
                $url = $site.'post.php?post=".$post->ID."&action=edit';

                        switch($post->post_type){
                            case 'post':
                                $this->dmd_create_submenu($post_title = $post->post_title, $post_type = $post->post_type, $url);
                                break;
                            case 'page':
                                $this->dmd_create_submenu($post_title = $post->post_title, $post_type = $post->post_type, $url);
                                break;
                        }

                        if($post->post_type != 'page' && $post->post_type != 'post'){
                            $url = $site.'admin.php?page=formidable&frm_action=edit&id='.$post->ID;

                            $this->dmd_create_submenu($post_title = $post->post_title, $post_type="formidable", $url);
                        }               
            }
          } 
    }

    /*
     * Функция для создания подменю
     */
    public function dmd_create_submenu($post_title, $post_type, $url){
        global $wp_admin_bar;

        $post_type="dmd_".$post_type.' searchclass';

        $wp_admin_bar->add_menu( array(
                'id'    => $post_title,
                'title' => $post_title,
                'href'  => $url,
                'parent'=>'FastMenu',
                'meta'=> array('target' => '_blank', 'class' => $post_type)
            )
        );
    }     
}

$a = new dmd_pages();

Код из второго файла:

<?php 
/*
 * Включить wp-config для использования функций WordPress
 */
//include_once($_SERVER['DOCUMENT_ROOT'].'wp-config.php' );

/*
 * Сохранить ПОСТЫ в переменную.
 * Чекбоксы передаются с помощью 1 или 0.
 */
$dmd_posts = $_POST['post'];
$dmd_pages = $_POST['page'];
$dmd_searchbox = $_POST['searchbox'];
$dmd_formidable = $_POST['formidable'];

$dmd_setting_values = $dmd_posts.','.$dmd_pages.','.$dmd_searchbox.','.$dmd_formidable;

/*
 * Проверить наличие ключа с помощью cURL.
 * Данные ключа находятся на отдельном сервере.
 */
function dmd_check_key($arg){
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => 'https://xxx.de/dmd-pages-pro/dmd_key_generator.php?key='.$arg.'&website=".$_SERVER["HTTP_HOST'],
        CURLOPT_USERAGENT => 'Codular Sample cURL Request',
        CURLOPT_VERBOSE => 1,
        CURLOPT_SSL_VERIFYPEER => false
    ));
    curl_setopt($curl, CURLOPT_STDERR, fopen("curl_debug.txt", "w+"));
    $resp = curl_exec($curl);
    curl_close($curl);

    return $resp;
}

if(isset($_POST['key'])){
    $x = dmd_check_key($_POST['key']);

    if($x == true){
        if(!get_option('dmd-pages-key-status')){add_option('dmd-pages-key-status', 'true');}else{update_option('dmd-pages-key-status', 'true');}    
        if(!get_option('dmd-pages-key')){add_option('dmd-pages-key', $_POST['key']);}else{update_option('dmd-pages-key', $_POST['key']);}            
    }
}

/*
 * Настройки в админ центре WP DMD Pages сохраняются
 */
function saveMethod($dmd_setting_values){
    if(!get_option('dmd-pages-settings')){
        add_option('dmd-pages-settings', $dmd_setting_values);
    }else{
        update_option('dmd-pages-settings', $dmd_setting_values);
    }    
}
saveMethod($dmd_setting_values);

Тот факт, что плагин установлен и активирован и его код PHP выполняется, не означает, что он сразу становится частью WordPress. Вы должны дать вашему плагину инициализироваться на хук WordPress, это значит, что код не будет выполнен, пока WordPress не достигнет определенной стадии в процессе выполнения.

Вы уже делаете много таких хуков, так что хорошо справились!

Попробуйте заменить последнюю строку в dmd_main.php с
$a = new dmd_pages();
на

add_action( 'init', 'wpse_228476_dmd_init' );
function wpse_228476_dmd_init() {
    $a = new dmd_pages();
}

Я не уверен, пытаетесь ли вы использовать функции WordPress за пределами самой системы WordPress, но для этого вам просто нужно сделать следующее:

require( 'path-to-wordpress/wp-load.php' );

в начале вашего файла, если путь к системе WordPress на самом деле $_SERVER['DOCUMENT_ROOT'], тогда вы бы сделали:

require ( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );

Ответ или решение

Чтобы ответить на вопрос о проблеме использования функций WordPress после подключения файла с помощью require_once, важно глубже понять, как работает WordPress и как правильно инициировать плагины. Давайте рассмотрим эту задачу более подробно.

Теория

В WordPress есть определенные этапы инициализации, во время которых подгружаются и работают его внутренние функции. Когда вы подключаете сторонний файл к вашему основному файлу плагина с помощью require_once, важно убедиться, что WordPress уже полностью инициализирован и у вас есть доступ к его функциям.

Основные ошибки, возникающие при подобном подключении файлов в WordPress, связаны с неправильным порядком инициализации. Если соединение с WordPress не установлено, то использование таких функций, как get_option или add_option, вызовет ошибку "Call to undefined function". Поэтому инициализация вашего кода должна происходить после запуска основных функций WordPress.

Пример

Ваш основной файл (dmd_main.php) использует класс dmd_pages, который предназначен для регистрации действий и добавления меню в администраторскую панель. Вы подключаете второй файл dmd_second.php через require_once, однако сталкиваетесь с проблемой при вызове функций WordPress в этом втором файле.

Все ключевые действия, включая инициализацию плагина и использование функций WordPress, должны быть реализованы через хуки WordPress. В идеале, это значит, что создание объекта вашего класса должно происходить на этапе init WordPress или позже.

Применение

Для решения вашей проблемы рекомендуется изменить подход к инициализации плагина, используя механизм хуков WordPress. Перепишем ваш код для достижения оптимальных результатов:

  1. *Основной файл (dmd_main.php)**

    Измените создание экземпляра вашего класса следующим образом:

    add_action('init', 'initialize_dmd_pages');
    function initialize_dmd_pages() {
       $a = new dmd_pages();
    }

    Это гарантирует, что ваш плагин и все его подключаемые модули инициализируются только после завершения процесса начальной загрузки WordPress, когда все его функции, такие как get_option, уже доступны.

  2. *Второй файл (dmd_second.php)**

    Если в этом файле вам необходимо использовать функции WordPress, убедитесь, что вызовы этих функций происходят только после инициализации WordPress. Поскольку файл включается из основного, вы можете использовать хуки аналогичным образом и в это файле, если потребуется.

  3. Не используйте wp-load.php или wp-config.php

    Использование wp-load.php или wp-config.php для загрузки функций WordPress в кастомном файле или плагине крайне не рекомендуется, так как это может привести к дублированию и нарушению работы вашего сайта, особенно что касается использования глобального состояния.

Объяснение

Когда вы делаете запрос к функциям WordPress, ваша задача состоит в том, чтобы интегрировать ваш код таким образом, чтобы он согласованно работал внутри структуры WordPress, используя предоставленные хуки и API. Это способствует более чистому, безопасному и устойчивому коду, который легко поддерживать и который не вызывает конфликтов с другими плагинами или темами WordPress.

Заключение: Управление порядком выполнения вашего плагина на соответствующих этапах инициализации WordPress через хуки — лучший способ гарантировать, что все функции будут правильно подключены. Это решение позволяет вашему коду работать в согласованности с экосистемой WordPress, создавая более надежный и производительный продукт.

Оцените материал
Добавить комментарий

Капча загружается...