我正在编写一个插件,只是在发布新帖子时向订阅者发送电子邮件(因此在处理待处理,更新或草稿等时不应发送任何电子邮件)
在插件定义中我有:
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确实经常发生,每当我进行更新,新发布时,我都会收到8封电子邮件,或者即使我只是停留在wordpress页面上,它也会自动更新。
我试图找到一些只在真正发布新帖子时才会发生的回调: new_to_post
根本不起作用。
有人可以帮助我吗?
干杯 菲尔
答案 0 :(得分:0)
您收到这么多电子邮件的原因是因为您没有正确添加操作,如下所述。就像现在一样,你实际上是调用你的函数来发送电子邮件很多次并将函数的结果挂钩到动作(它没有真正做任何事情),而不是将函数挂钩到动作。
您的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;