【问题标题】:Wordpress publish_post fires too oftenWordpress publish_post 触发太频繁
【发布时间】:2012-10-21 04:21:30
【问题描述】:

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

在我的插件定义中:

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

根本不工作。

有人可以帮我吗?

干杯 菲尔

【问题讨论】:

    标签: wordpress plugins publish slug


    【解决方案1】:

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

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

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

    您的函数也没有将$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;
    

    【讨论】:

    • 你好,谢谢你的建议,他们都说得通,但是,修改后,它仍然会在每次帖子更新时发送一封电子邮件,因为一旦发布了帖子,它会一直处于发布状态?我只希望它在第一次发布时发送电子邮件
    • 我建议设置一个帖子元来指示电子邮件是否已发送,并在我们函数的顶部检查它。如果 meta 为 true,则返回方法。
    • 为它设置一个元是解决方案!虽然我确信 wordpress 可以做得更好!
    • @phil88530 还有其他一些选项,但我认为设置元数据效果最好。假设电子邮件由于某种原因未发送,但该功能与触发一次且仅一次的操作挂钩……您如何重新发送?使用元路由,您可以重新保存帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2019-11-18
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多