Intereting Posts
Обновление записи базы данных в плагине Объект Ajax не определен – файл JS находится в папке плагина Получение текущего автора (он изменился) сообщения, а не оригинального автора Как проверить уровень пользовательского сайта основного сайта с сайта в многопользовательской сети Показать последние сообщения с thumbnail внутри масонства Что мне нужно для тестирования одного скрипта в admin Почему в определении WP_PLUGIN_DIR не используется DIRECTORY_SEPARATOR? как редактировать пользовательские поля галереи типов из front-end Добавление настраиваемых полей в контент из плагина Корзина покупок WordPress, которая поддерживает варианты вариантов продукта 2 уровня Получение объекта Product в пользовательском цикле get_usermeta () устарел в пользу get_user_meta (). Но почему он не использует его? 301 перенаправление через правила htaccess на новом сайте мета-запрос не показывает никаких результатов? Поделиться кнопками Facebook Twitter, так же как wordpress.com без webservice

Доступ к базе данных из плагина вне крючков действия

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

Для хранения данных плагин использует функцию wpdb , которую, как я понимаю, рекомендуется для практики.

Например:

 # Require wp-load.php in order to access $wpdb. require_once(dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'wp-load.php'); global $wpdb; $table_name = $wpdb->prefix . 'placespeak'; $query_array = [$app_id]; $client_info = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . $table_name . " WHERE id = %d", $query_array ) ); 

Текущая версия плагина размещена здесь на github .

Однако, когда я отправил плагин в каталог плагина WordPress, я получил этот ответ:

Вызов основных загрузочных файлов напрямую

В том числе wp-config.php, wp-blog-header.php, wp-load.php или почти любой другой основной файл WordPress, который вы должны вызывать напрямую через include, не является хорошей идеей, и мы не можем одобрить плагин, который делает это, если у него нет веских оснований для загрузки файла (ов). Он подвержен сбою, поскольку не все установки WordPress имеют одинаковую структуру файлов.

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

Это совершенно разумно, но я не уверен, как действовать дальше.

Поскольку конечная точка не является частью интерфейса администратора WordPress, в ней нет крючков (я думаю?).

Я пробовал использовать «wipped-up» версию wp-load , например

 define( 'SHORTINIT', true ); require_once(dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'wp-load.php'); 

но это wpdb ошибку Call to undefined function trailingslashit() при выполнении запроса базы данных с использованием wpdb как указано выше, что является известным ограничением использования версии wp-load SHORTINIT .

Есть ли другой способ доступа к базе данных, который должен работать в этом контексте и который будет приемлемым для поддерживающих плагинов?

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

 add_action( 'init', function() { /** Add a custom path and set a custom query argument. */ add_rewrite_rule( '^your/custom/path/?$', 'index.php?custom_action=1', 'top' ); } ); add_filter( 'query_vars', function( $query_vars ) { /** Make sure WordPress knows about this custom action. */ $query_vars []= 'custom_action'; return $query_vars; } ); add_action( 'wp', function() { /** This is an call for our custom action. */ if ( get_query_var( 'custom_action' ) ) { // your code here } } ); 

Теперь нажмите https://yoursite.com/your/custom/path/ WordPress загрузит и вызовет ваш код.

Еще более простым способом было бы использовать параметр $_GET .

 add_action( 'init', function() { if ( !empty( $_GET['custom_action'] ) ) { // your code here } } ); 

А затем нажмите https://yoursite.com/?custom_action=1

Ваш выбор, в зависимости от того, хотите ли вы хороший URL-адрес или вы удовлетворены менее красивым параметром GET.