Подключить класс плагина в стороннем файле и вызвать функцию. Вордпресс.

rafaello

Новичок
Здравствуйте!
Постараюсь объяснить поподробнее.
Есть такая связка: плагин Directory Pro + Woocommerce + Wordpress.

В файле темы functions.php я прописал хук
PHP:
add_action( 'woocommerce_order_status_changed', 'action_function_name_9350', 99, 3 );
и соответственно функцию function action_function_name_9350($х,$y,$z), которая делает запрос в базу данных и меняет срок действия тарифа так как мне надо. (в коробочной версии даты меняются не так, как мне надо).
Хук срабатывает и функция выполняется, все нормально.

Проблема возникла в том, что на морде сайта срок действия нового тарифа отображается по старой (коробочной методике), хотя в база данных стоит изменная дата.
Парадокс какой то.
Потом я обнаружил, что в настройках в админке данного плагина (Directory Pro) есть кнопка "Очистить системный кеш". Вот именно после нажатия на эту кнопку выскакивает сообщение, что кеш очищен и что удивительно, дата на морде сайта обновляется так как в базе данных.
Я стал искать всевозможные варианты программно очистить кеш (браузера, сервера), удаление куков и т.д. Ничего не работает. Значит у этого плагина есть своя система кеширования.
Я скопировал код на этой кнопке "Очистить системный кеш". Вот он:
HTML:
<form id="drts-form-28a52522db1b378f4b6751d54338a157" method="post" action="http://mysite.ru/wp-admin/admin.php?page=drts/directories&q=/_drts/system/tool_with_progress/" class="drts-form drts-system-admin-runtoolwithprogress-run" novalidate="novalidate" data-form-name="system_admin_runtoolwithprogress_run">
<div class="drts-form-buttons drts-bs-form-inline drts-bs-mt-5">
<button type="submit" name="_drts_form_submit[0]" value="0" data-modal-title="false" class=" drts-bs-mr-3 drts-bs-btn drts-bs-btn-primary drts-bs-btn-lg">Run Tool</button>
</div>
<input type="hidden" name="tool" value="system_clear_cache" class="drts-form-field drts-form-type-hidden">
<input type="hidden" name="redirect" value="/directories/system/" class="drts-form-field drts-form-type-hidden">
<input type="hidden" name="_drts_form_build_id" value="28a52522db1b378f4b6751d54338a157" class="drts-form-field drts-form-type-hidden">
<input type="hidden" name="_t_" value="81d1695a07">
</form>
Потом Я создал файл /wp-admin/my_post.php
PHP:
<?php
require_once __DIR__ . '/admin.php';
do_action( 'load-toplevel_page_drts/directories' );
do_action( 'toplevel_page_drts/directories' );
Вы спросите, откуда я взял этот код? Отвечу, я его вычислил из файла /wp-admin/admin.php методом подстановки переменных и проверкой на работоспособность.
И прописал вышеуказанную html-форму и если я вызываю эту форму, изменив action="admin.php?" на action="my_post.php?" из внутри админки, то все работает, то есть происходит редирект и выскакивае сообщение, что кеш очищен.
Однако, мне необходимо запустить это из хука, который прописан в functions.php моей темы.
Там я прописал все соответственно через curl post.
Так вот из темы не работает, выходит ошибка то токен неверный, то еще чего.
Раз не работает из темы, то значит здесь два решения:
  1. Необходимо напрямую прописать функцию очистки кеша в хуке, а не вылавливать через curl post. А для этого необходимо в самом хуке вызвать экземпляр того класса и вызвать функцию очистки.
  2. Правильно прописать файл /wp-admin/my_post.php, чтобы через него срабатывал curl post.
Честно говоря вообще не понимаю, каким образом срабатывает вот это:
PHP:
do_action( 'load-toplevel_page_drts/directories' );
do_action( 'toplevel_page_drts/directories' );
причем тут присутствуют и $_POST и $_GET
Я искал инфу в интернете и нашел, что do_action() создает хук. Но ведь при пост запросе происходит выполнение определенных функций, не понятно почему.
Искал через терминал
Bash:
grep -rl 'load-toplevel_page_drts/directories'
grep -rl 'toplevel_page_drts/directories'
grep -rl 'load-toplevel_page_drts'
grep -rl 'toplevel_page_drts'
grep -rl '_page_drts'
все бесполезно, терминал не нашел файлов с таким содержимым, видать эти названия формируются через какие то переменные.
Файлы класса кеширования я нашел:
PHP:
wp-content/plugins/directories/lib/application/Component/System/Tool/ClearCacheTool.php
wp-content/plugins/directories/lib/application/Component/System/Helper/ToolsHelper.php
wp-content/plugins/directories/lib/application/Component/System/SystemComponent.php
Вот содержание ClearCacheTool.php :
PHP:
<?php
namespace SabaiApps\Directories\Component\System\Tool;

class ClearCacheTool extends AbstractTool
{
    protected function _systemToolInfo()
    {
        return [
            'label' => __('Clear cache', 'directories'),
            'description' => __('This tool will clear settings and data currently cached.', 'directories'),
            'weight' => 5,
            'redirect' => true,
        ];
    }

    public function systemToolRunTask($task, array $settings, $iteration, $total, array &$storage, array &$logs)
    {
        $this->_application->getPlatform()->clearCache();
        $this->_application->Action('system_clear_cache');

        return 1;
    }
}
Подскажите, если по второму варианту, то как мне вызвать этот класс в хуке?
Или по первому варианту, как исправить файл /wp-admin/my_post.php ?
 

WMix

герр M:)ller
Партнер клуба
я конечно понимаю, что wp это еще один битрикс, но если разобраться как удаляется cache (файлы постирать/в базе строки поудалять) то все будет несколько проще. тут кроме как дебаггер ничего хорошего вероятно не посоветуешь, ну или звонок/письмо в support
 

fixxxer

К.О.
Партнер клуба
тут кроме как дебаггер ничего хорошего вероятно не посоветуешь
ну, можно попробовать "поломать" права на файл в кэше, посмотреть, где валится, и оттуда бектрейс

хотя это тоже вариация на тему дебаггера
 

rafaello

Новичок
Дебажить я вообще никогда не пробовал, еще не тот уровень. Думаю, что наверно надо просидеть недельку, изучая доки. Это конечно вариант.
Но вот сам вопрос, поставленный в заглавии этого топика.
Как подключить сторонний клас плагина в хуке, который выполняется в functions.php темы? Ведь я нашел тот код, который очищает кеш и он прописан в файле ClearCacheTool.php (см. выше).
Вот как вызвать функцию
PHP:
$this->_application->getPlatform()->clearCache();
$this->_application->Action('system_clear_cache');
?
 

rafaello

Новичок
Если я пишу так
PHP:
require_once '/var/www/mysity/wp-content/plugins/directories/lib/application/Component/System/Tool/AbstractTool.php';
то получаю ошибку
Код:
PHP Fatal error:  Interface 'SabaiApps\\Directories\\Component\\System\\Tool\\ITool' not found in /var/www/.......
 

rafaello

Новичок
Ура!!!! И все таки я переупрямил его! Нашел, куда кеш записыватся. В базу данных. Теперь дело техники........
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Дебажить я вообще никогда не пробовал, еще не тот уровень.
ну да, с 2013 годом регистрации то, зачем дебажить так рано начинать. Покажу этот топик нашему джуну, чтоб знал, что его ждет если не справится!
 

rafaello

Новичок
ну да, действительно, просто никогда руки не доходили до этого.
Вот и в этот раз выручил вот такой "дебаг":
Bash:
grep -rl 'function clearCache('
 
Сверху