2

我正在编写一个插件,它只是在发布新帖子时向订阅者发送电子邮件(因此当它处于待处理、更新或草稿等状态时不应发送任何电子邮件)

在插件定义中,我有:

add_action('plugins_loaded', 'setup_plugin_actions');

function setup_plugin_actions(){
  if(has_action('new_to_publish')){
    $simple_email_subscriber = new email_subscriber();

    add_action('new_to_publish', $simple_email_subscriber->email_subscribers());
  }
}

And in my email_subscribers method I have:

class email_subscriber(){
  function email_subscribers(){
    //get post information
    $post = get_post($post_id);

    $post = get_post( $post_id );
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return false;

    if(wp_is_post_revision($post->ID) || wp_is_post_autosave($post->ID)) return;

    //email code
    ......
  }
}

一个非常简单的代码,它只是试图向publish_post方法添加一个动作监听器。

但是,由于 publish_post 确实经常触发,所以每当我进行更新、新发布,或者即使我只是停留在 wordpress 页面上并且它会自动更新时,我都会收到 8 封电子邮件。

我试图找到一些只有在真正发布新帖子时才会发生的回调:new_to_post

根本不起作用。

有人能帮我吗?

干杯菲尔

4

1 回答 1

1

您收到这么多电子邮件的原因是您没有正确添加操作,如下所述。就目前而言,您实际上是在多次调用您的函数来发送电子邮件并将函数的结果挂钩到动作(实际上并没有做任何事情),而不是将函数挂钩到动作。

add_action有几个问题 - 您正在将您的方法添加到转换new_to_publish操作(仅在帖子状态为“新”并更改为“发布”时触发)而不是publish_post捕获从任何状态发布的帖子,并且您传递的方法无效 - 如果参数是对象上的方法,则参数是函数或数组的字符串,其中第一个元素是对象,第二个元素是函数。它应该看起来像:

add_action('publish_post', array($simple_email_subscriber, 'email_subscribers') );

您的函数也没有将 the$post_id作为参数,因此它永远不会知道要加载什么帖子。你的定义应该是:

function email_subscribers($post_id){ /* your code */ }

您还在$post = get_post( $post_id );函数中调用了两次,这是不必要的,但如果您想确保此函数仅在帖子状态为publish无论如何调用时才运行,请添加:

$post = get_post( $post_id );
if ($post->post_status != "publish") return;
于 2012-10-31T16:32:31.630 回答