1

Мне нужно работать с techcrunch wp-async-task для запуска задачи синхронизации в фоновом режиме в моем плагине Wordpress.wp-async-task не запускает метод run_action

Так, чтобы проверить, в нижней части основного файла у меня есть:

//top of the php file 
require_once(dirname(__FILE__) . '/lib/WP_Async_Task.php'); 
require_once(dirname(__FILE__) . '/class/my_api_status.class.php'); 
define('API_URL', '...'); 

/* ... */ 

// At the bottom of the file 
function my_api_status($api_url) 
{ 
    sleep(5); 
    $r = wp_safe_remote_get($api_url); 
    if (!is_wp_error($r)) { 
    $body = json_decode(wp_remote_retrieve_body($r)); 
    if (isset($body->success)) { 
     return; 
    } 
    } 
} 
add_action('wp_async_api_status', 'my_api_status'); 

function my_init_api_status() 
{ 
    new ApiStatusTask(); 
    do_action('api_status', constant('API_URL')); 
} 
add_action('plugins_loaded', 'my_init_api_status'); 

И статус апи класс задач

class ApiStatusTask extends WP_Async_Task { 

    protected $action = 'api_status'; 

    /** 
    * Prepare data for the asynchronous request 
    * @throws Exception If for any reason the request should not happen 
    * @param array $data An array of data sent to the hook 
    * @return array 
    */ 
    protected function prepare_data($data) { 
    return array(
     'api_url' => $data[0] 
    ); 
    } 

    /** 
    * Run the async task action 
    */ 
    protected function run_action() { 
    if(isset($_POST['api_url'])){ 
     do_action("wp_async_$this->action", $_POST['api_url']); 
    } 
    } 

} 

Функция prepare_data правильно вызывается launch и после этого launch_on_shutdown является также правильно вызывается и, наконец, wp_remote_post вызывается в конце launch_on_shutdown с admin-post.php. Но функция run_action никогда не называется ... и поэтому my_api_status в основном файле.

Возможно, что-то не так?

ответ

1

В ближайшее время я приведу полный пример плагина. Но сейчас, я нашел мою проблему:

// In the `launch_on_shutdown` method of `WP_Async_Task` class 

public function launch_on_shutdown() { 
    GcLogger::getLogger()->debug('WP_Async_Task::launch_on_shutdown'); 
    if (! empty($this->_body_data)) { 
    $cookies = array(); 
    foreach ($_COOKIE as $name => $value) { 
     $cookies[] = "$name=" . urlencode(is_array($value) ? serialize($value) : $value); 
    } 

    $request_args = array(
     'timeout' => 0.01, 
     'blocking' => false, 
     'sslverify' => false, //apply_filters('https_local_ssl_verify', true), 
     'body'  => $this->_body_data, 
     'headers' => array(
      'cookie' => implode('; ', $cookies), 
     ), 
    ); 

    $url = admin_url('admin-post.php'); 
    GcLogger::getLogger()->debug('WP_Async_Task::launch_on_shutdown wp_remote_post'); 
    wp_remote_post($url, $request_args); 
    } 
} 

Опция sslverify не удалось в моей местной среде. Я просто должен был поставить его на ложь, если мы не на производстве.

С помощью этой опции run_action является правильным триггером.

+0

Hi Thomas, спасибо, что разместили это! Я попытался запустить эту аналогичную установку на своем Wordpress v4.7.5. Я установил пользовательский класс, который расширяет класс WP_Async_Task в моем файле functions.php темы. Но это не работает даже при настройке sslverify в методе 'launch_on_shutdown' класса' WP_Async_Task'. – Qwerty

+0

Знаете ли вы, что плагин Techcrunch и этот метод будут работать в Wordpress v4.7.5. Был борется за то, чтобы этот плагин работал с крюком, даже с крюком wp_async_save_post. – Qwerty