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'); 

和API狀態任務類

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_postlaunch_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

嗨托馬斯,感謝您張貼這個!我試圖在我的Wordpress v4.7.5上運行這個類似的設置。我已經在我的主題functions.php文件中設置了擴展WP_Async_Task類的自定義類。但是,即使在WP_Async_Task類的'launch_on_shutdown'方法中設置sslverify,這也不起作用。 – Qwerty

+0

你知道Techcrunch插件和這種方法是否可以在Wordpress v4.7.5中使用。一直在努力讓這個插件使用鉤子,甚至是wp_async_save_post鉤子。 – Qwerty