为什么同一个POST调用了两次TRANSPORT_POST_TYPE钩子?

时间:2017-10-12 作者:Dario Capozzi

每次创建新帖子时,我都需要执行curl请求。

为了实现这一点,我使用了以下代码,非常类似于one provided in the Codex.

add_action(\'transition_post_status\', \'wpse120996_do_curl\', 10, 3);
function wpse120996_do_curl($new_status, $old_status, $post)
{
    $post_ID = $post->ID;
    error_log(" [ ". date("Y-m-d H:i:s") . " ] ". $post_ID . " : " .
    $old_status . " -> " . $new_status . "\\n", 3, $_SERVER[\'DOCUMENT_ROOT\'] . "/log.txt");

    if ($post->post_type != \'post\' || $new_status != \'publish\' || $old_status != \'draft\') {
       return;
    }

    $url = \'https://api.telegram.org/bottoken/sendMessage\';
    // Get cURL resource
    $curl = curl_init();
    // Set some options - we are passing in a useragent too here
    curl_setopt_array($curl, array(
          CURLOPT_RETURNTRANSFER => 1,
          CURLOPT_URL => $url,
          CURLOPT_USERAGENT => \'Codular Sample cURL Request\',
          CURLOPT_POST => 1,
          CURLOPT_POSTFIELDS => array(
              chat_id => \'@mychatid\',
              text => print_r($post, true)
          )
      ));
    // Send the request & save response to $resp
    $resp = curl_exec($curl);
    error_log(" [ ". date("Y-m-d H:i:s") . " ] sending post with ID = ". $post_ID ."\\n", 3, $_SERVER[\'DOCUMENT_ROOT\'] . "/log.txt");
    if (!curl_exec($curl)) {
        die(\'Error: "\' . curl_error($curl) . \'" - Code: \' . curl_errno($curl));
    }
    // Close request to clear up some resources
    curl_close($curl);
}
问题是每次保存帖子时都会调用两次wpse120996\\u do\\u curl(),如下面的屏幕截图所示。enter image description here

如何在保存帖子时仅获取一个函数调用?

我在Wordpress 4.8.2中运行此代码,没有安装插件。

编辑:在代码中添加error\\u log()后,查看日志。txt,似乎只调用了一次wpse120996\\u do\\u curl(),但不幸的是,完成了两个curl请求。

 log.txt content

 [ 2017-10-13 16:31:31 ] 109 : new -> auto-draft
 [ 2017-10-13 16:31:37 ] 109 : auto-draft -> draft
 [ 2017-10-13 16:32:05 ] 109 : draft -> publish
 [ 2017-10-13 16:32:05 ] sending post with ID = 109
 [ 2017-10-13 16:32:06 ] 110 : new -> inherit

1 个回复
最合适的回答,由SO网友:Frank P. Walentynowicz 整理而成

替换此行:

if ($old_status != \'draft\' || $new_status != \'publish\') {
使用:

if ( $post->post_type != \'post\' || $new_status != \'publish\' || $old_status != \'auto-draft\' ) {
您想在上运行代码post 转换自auto-draftpublish, 这只会发生一次post 已创建。

UPDATE

问题出在代码的这一部分:

$resp = curl_exec($curl);
error_log(" [ ". date("Y-m-d H:i:s") . " ] sending post with ID = ". $post_ID ."\\n", 3, $_SERVER[\'DOCUMENT_ROOT\'] . "/log.txt");
if (!curl_exec($curl)) {
    die(\'Error: "\' . curl_error($curl) . \'" - Code: \' . curl_errno($curl));
}
您正在呼叫curl_exec($curl) 两行!首先:

$resp = curl_exec($curl);
其次:

if (!curl_exec($curl)) {
更改您的if 声明收件人:

if (!$resp) {

结束

相关推荐

AJAX和PHP|通过AJAX从PHP文件中调用特定的PHP函数?

我是AJAX的初学者,所以欢迎参考。是否可以使用AJAX从PHP文件调用特定的PHP函数(而不是运行整个PHP文件)?如果是,如何?背景:我有一个我想要的jQuery按钮,只要点击它,就会调用某个给定PHP文件中的特定PHP函数。我不希望创建一个全新的文件来运行函数体,因为我想从中运行代码的PHP文件是一个大的功能文件(WordPressfunctions.php 文件)。