Поддержка Проблемы и решения Как подключить в сторонний файл фукнции ВП?

  • У плагина есть 2 файла.
    Один основной, а другой вспомогательный, просто на php, на который присылаются данные от другого сайта.

    Для работы второго, нужны 3 функции от ВП:
    get_option
    global $wpdb; — для работы с БД
    wp_mail
    Для того, чтобы они работали, я написал:

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

    Но при проверке плагина при добавлении в каталог, написали следующее, как еще можно подключить, чтобы модераторы приняли плагин?

    ## Calling core loading files directly

    Including wp-config.php, wp-blog-header.php, wp-load.php, or pretty much any other WordPress core file that you have to call directly via an include is not a good idea and we cannot approve a plugin that does so unless it has a very good reason to load the file(s). It is prone to failure since not all WordPress installs have the exact same file structure.

    Usually plugins will include wp-config.php or wp-load.php in order to gain access to core WordPress functions, but there are much better ways to do this. It’s best if you tie your processing functions (the ones that need but don’t have access to core functions) into an action hook, such as «init» or «admin_init».

    Please consult the Plugins API reference for more information: http://codex.wordpress.org/Plugin_API

    If you’re trying to use AJAX, please read this: http://codex.wordpress.org/AJAX_in_Plugins

    For other possibilities, or to better understand why we disallow this, read this: http://ottopress.com/2010/dont-include-wp-load-please/

    If you’re trying to use it because you need to access WordPress functions outside of WordPress, we’d actually much rather you didn’t do that at all. Your plugin should be inside WordPress, only accessible to people who are logged in and authorized, if it needs that kind of access. Your plugin’s pages should be called via the dashboard like all the other settings panels, and in that way, they’ll always have access to WordPress functions.

    • Тема изменена 7 лет, 5 месяцев назад пользователем lexsar777.
    • Тема изменена 7 лет, 5 месяцев назад пользователем lexsar777.
    • Тема изменена 7 лет, 5 месяцев назад пользователем lexsar777.
Просмотр 15 ответов — с 1 по 15 (всего 15)
  • Модератор Yuri

    (@yube)

    просто на php, на который присылаются данные от другого сайта.

    Неверный подход. Такой метод далеко не всегда будет работать. Правильнее повесить свой обработчик либо на аякс, как описано в Кодексе, либо на хук ‘init’. В обоих случаях идентифицироваться он будет по уникальному get- или post-параметру. То есть, не WP цеплять к своему скрипту, с свой скрипт вызывать из WP. Благо API позволяет.

    Пробовал во втором файле сделать через инит вот так:
    обернул код, который использует get_option в function test() {}
    и потом так его вызвать пытался:
    add_action( 'init', 'test' );

    Fatal error: Call to undefined function add_action() in Z:\home\test.ru\www\wp-content\plugins\..\…php on line 319

    на всякий случай поясню суть плагина:
    после сохранения записи ВП, основной файл плагина отправляет текст на сторонний сайт, онлайн-сервис, который обрабатывает его.
    затем результаты обработки с того сайта присылаются во второй файл.
    а второй файл формирует уже отчет в зависимости от настроек плагина, для получения которых нужно get_option() и доступ к базе.

    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.

    вы свой второй файл подключите через первый файл.
    а вообще — с add_action зачем вам вообще второй файл? перенесите все в один.

    Перенес все в один файл.
    Запускаю файл — выдает ошибку

    Fatal error: Call to undefined function plugins_url() in Z:\home\test.ru\www\wp-content\plugins\test\test.php on line 50

    При этом plugins_url() — используется вообще в другой функции.
    ранее, вместо этой функции, использовал __FILE__ и SERVER… но модерация не пропустила плагин, мол надо использовать функции вордпресса для этого.

    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.
    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.
    Модератор Yuri

    (@yube)

    Запускаю файл

    Как?

    Вообще-то, «запускать» должен движок через API. Никакого прямого общения снаружи с php-файлами плагина быть не должно.

    function test_activate() {
    add_option(...); //настройки плагина по умолчанию при его активации
    }
    $plugins_url = plugins_url();
    register_activation_hook( $plugins_url, 'test_activate' );

    запускал через браузер напрямую к файлу. Ведь сторонний сервис так же будет отправлять или нет?

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

    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.
    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.
    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.
    Модератор Yuri

    (@yube)

    Неужто модераторы не приняли из-за __FILE__ в register_activation_hook? В Кодексе в примере прямо так и написано

    
    register_activation_hook( __FILE__, 'myplugin_activate' );
    

    Сомневаюсь. Я бы делал как в Кодексе.

    А за require($_SERVER['DOCUMENT_ROOT'].'/wp-load.php'); я бы первый двойку поставил 🙂

    Модератор Yuri

    (@yube)

    запускал через браузер напрямую к файлу.

    Фе!

    Кстати, я последнее время взял за правило начинать плагины с

    
    if (! defined('ABSPATH')) die();
    

    Ведь сторонний сервис так же будет отправлять или нет?

    Нет. Должно отправляться движку, а не конкретному скрипту. А движок вызовет функцию из скрипта. CallBack называется 🙂

    Что касается __FILE__
    Может я не так понял, но написали вот что:
    (имена функций, классов и айди — переименовал, чтоб были уникальныеЮ, а про FILE не понял, но там какие-то примеры. ссылки. потому использовал plugins_url)
    ## Generic function (and/or define) names

    All plugins should have unique function names, defines, and classnames. This will prevent your plugin from conflicting with other plugins or themes.

    For example, if your plugin is called «Easy Custom Post Types», then you might prefix your functions with ecpt_{your function name here}. Similarly a define of LICENSE would be better done as ECPT_LICENSE. You can use namespaces instead, however make sure that those also are unique. A namespace or class of ‘MyPlugin’ is NOT actually all that unique, you see.

    This extends to anything in a define. For example …

    define( ‘PLUGIN_PATH’, plugins_url( __FILE__ ) );

    That define is a global, so PLUGIN_PATH could conflict with a number of other things.

    Don’t try to use two letter slugs anymore. As of 2016, all the good ones are taken. Instead consider easy_cpts_ (from the first example).

    Similarly, don’t use __ to prefix, as the double underscore should be reserved for WordPress itself.

    Фе!

    А как еще тестировать?
    Вот сейчас в ручную к браузеру не обращался. Плагин не сработал. Письмо не пришло. В чем дело не понятно. Зато если руками смотреть видно, что не нравится то, что выше писал.

    Нет. Должно отправляться движку, а не конкретному скрипту. А движок вызовет функцию из скрипта. CallBack называется

    А как напрямую отправить движку? У этого сайта есть колбек. Вот информация:

    Если вы хотите получить уведомление о факте завершения (вместе с результатами) проверки вашего текста, то вы можете при добавлении текста на API в параметре callback указать адрес вашего скрипта, который обработает наш POST-запрос с результатами проверки текста.
    Максимальное число попыток отправки результатов проверки — 3.
    В callback POST-запросе отправляются 4 параметра…

    Вот в настройках скрипта сервиса, есть пункт, в которой я в соответствии с инструкцией вписал адрес своего скрипта для обработки результатов
    $postQuery['callback'] = "$plugins_url/скрипт.php";

    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.
    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.
    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.
    Модератор Yuri

    (@yube)

    Да просто же.

    
    add_action('init', 'mycallback');
    function mycallback() {
      if ( $_SERVER['REQUEST_URI'] != 'mycallback' or $_SERVER['REQUEST_METHOD'] != 'POST') return;
    // post на мыло мыло чтобы видеть
      wp_mail('your@email', 'DEBUG', print_r($_POST, 1));
    // собственно обработка
      exit;
    }
    

    А стороннему сервису в качестве колбэка указать //ваш.домен/mycallback/.

    Если делать универсальный плагин — c ЧПУ и без оного, в корне и в субдиректории — то можно использовать get-параметр для адреса в качестве индентификатора вызова колбэка.

    p.s. Код для ориентации, а не для копирования.

    • Ответ изменён 7 лет, 5 месяцев назад пользователем Yuri.

    Спасибо. Что я сделал не так?
    во файле с функцией отправки на проверку, указал следующий колбек:
    $postQuery['callback'] = $_SERVER['SERVER_NAME'].'/mycallback';

    в основном файле

    add_action('init', 'mycallback');
    function mycallback() {
      if ( $_SERVER['REQUEST_URI'] != 'mycallback' or $_SERVER['REQUEST_METHOD'] != 'POST') return;
    // post на мыло мыло чтобы видеть
    wp_mail('почта@yandex.ru', 'DEBUG', print_r($_POST, 1));
      exit;
     } 

    подумал, может дело в том,что слеша не хватает

    add_action('init', 'mycallback');
    function mycallback() {
      if ( $_SERVER['REQUEST_URI'] != '/mycallback' or $_SERVER['REQUEST_METHOD'] != 'POST') return;
    // post на мыло мыло чтобы видеть
    wp_mail('почта@yandex.ru', 'DEBUG', print_r($_POST, 1));
      exit;
     } 

    всеравно не срабатывает

    что не так?

    может mycallback — нужно указать путь к файлу плагина?

    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.
    Модератор Yuri

    (@yube)

    $_SERVER['SERVER_NAME'].'/mycallback';

    Вы уверены, что это порождает корректный url?

    всеравно не срабатывает

    Для проверки можно симулировать обращение. Если нет специального инструмента, можно по-быстрому написать html-форму с нужными action и параметрами, в ней тыкать submit и смотреть, что вызывается.

    может mycallback — нужно указать путь к файлу плагина?

    Файл с обработчиком должен быть подключен либо как плагин, либо инклюдом в плагине.

    Я запутался 🙁
    Напишу по пунктам, чтобы всем, в т.ч. и мне понятнее было, как что работает и что надо в итоге:

    Есть 3 файла.
    Файл1 — файл плагина (настройка его параметров + при сохранении поста вызывается Файл2)
    Файл2 — выполняет функцию отправки текста из файла1 на проверку грамматики и прочего на сторонний сайт, на выходе идентификатор, который заносится обратно через файл1 в базу данных ВП.
    В файле2 указывается колбек, куда отправить результат проверки, т.е. в Файл3
    Файл3 — при поступлении POST запросов со стороннего сайта, происходит отправка результатов на почту.
    Файл3 я объединил с Файлом1 — как предложили выше.
    В настоящее время для проведения теста вообще его отключил. и вместо него:

    add_action('init', 'mycallback');
    function mycallback() {
      if ( $_SERVER['REQUEST_URI'] != 'mycallback' or $_SERVER['REQUEST_METHOD'] != 'POST') return;
    // post на мыло мыло чтобы видеть
    wp_mail('почта@yandex.ru', 'DEBUG', print_r($_POST, 1));
      exit;
     } 

    Вопрос1 — $_SERVER[‘REQUEST_URI’] != ‘mycallback — подозреваю, что тут нужно другой адрес, но какой. К чему??
    попробовал сделать так:
    if ( $_SERVER['REQUEST_URI'] != '/wp-content/plugins/myplugin/myplugin.php'
    Вопрос2 — что нужно указать в колбеке второго файла? Путь к чему, тоже к плагину?

    Вы уверены, что это порождает корректный url?

    Какой правильный? Я постами выше видимо понял буквально и не правильный адрес значит указал. Думал этот колбек в корень сайта надо отправить и там его ловить.

    В общем теперь сделал так (да, не примут такое, но для теста пойдет):
    $postQuery['callback'] = 'http://'.$_SERVER['SERVER_NAME'].'/wp-content/plugins/myplugin/myplugin.php';

    Файл с обработчиком должен быть подключен либо как плагин, либо инклюдом в плагине.

    Файл обработчика (файл3) как писал объединен с файлом1 и располагается по адресу
    /wp-content/plugins/myplugin/myplugin.php

    На почту всеравно никакие отчеты с результатами не приходят.

    по-быстрому написать html-форму с нужными action и параметрами, в ней тыкать submit и смотреть, что вызывается.

    Где её создать? в каком файле?
    какой экшн является нужный? Какие параметры прописывать и где?
    Если я правильно понял, то писать нужно в файле2 После чего напрямую его запустить

    в форме написал:

    <form method="post" action="<?php echo 'http://'.$_SERVER['SERVER_NAME'].'/wp-content/plugins/myplugin/myplugin.php'?>" id="id1">
    <input type="text" name="nametext" value="valuetext" />
    <input type="submit" value="test" />
    </form>

    после чего в браузере запускаю этот файл. И выдает

    Fatal error: Call to undefined function register_activation_hook() in /home/admin/web/default.domain/public_html/wp-content/plugins/myplugin/myplugin.php on line 50

    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.
    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    после чего в браузере запускаю этот файл

    Нужно запускать не файл напрямую, а обращаться к сайту с определённым параметром — например, http://mysite.ru/mycallback/ или http://mysite.ru/?mycallback=1 — тогда загрузится движок со всеми функциями и в определённый момент передаст управление плагину.

    А в плагине можно проверять наличие этого параметра в адресе и в зависимости от этого выполнять действия.

    mycallback — не сработал, писало 404 ошибку — страница не найдена и все. письма нет.
    уже написал очередное письмо, хотел уточнить кое-что, но перед этим проверить решил вариант2
    ?mycallback=1 — заработало, письмо пришло!!

    Конечно есть еще какие-то косяки.. вот 2 письма почему-то стало приходить, хотя у меня стоит, что после отправки первого письма в базу поступает метка, что все ОК, и больше не надо отправлять писем.. Но это дальше уже разбираться буду. С подключением вопрос решен! 🙂

    • Ответ изменён 7 лет, 5 месяцев назад пользователем lexsar777.
Просмотр 15 ответов — с 1 по 15 (всего 15)
  • Тема «Как подключить в сторонний файл фукнции ВП?» закрыта для новых ответов.