发布帖子时向特定用户发送电子邮件

时间:2013-05-22 作者:Angus Russell

我有以下代码,应该在第一次发布新帖子时运行,检查自定义字段“specific\\u users”是否有数据(这使用高级自定义字段),如果有,请向每个选定的用户发送电子邮件。

/**
 * Send users a notification of new grower posts 
 */
function notify_growers($post) {
// Only notify for grower posts
if ( $post->post_type != \'grower_posts\' ) return;

$post_id = $post->ID;

// ...run code once
if ( !get_post_meta( $post_id, \'emailsent\', $single = true ) ) {

    $specific_users = get_field(\'specific_users\',$post_id);
    if(isset($specific_users) && is_array($specific_users)) {
        foreach($specific_users as $specific_user) {

            $to = $specific_user[\'user_email\'];
            $subject = \'Grower News: \' . get_the_title($post_id);

            $message = \'\';
            $message .= \'<p>\' . get_the_excerpt($post_id) . \'…</p>\';
            $message .= \'<p><a href="\' . get_permalink($post_id) . \'"><strong>Continue Reading &raquo;</strong></a></p>\';

            wp_mail($to, $subject, $message );

        }
        unset($specific_user);
        //print("<pre>User IDs = ".print_r($user_ids,true)."</pre>");
    } else { return; }

    // Make sure this doesn\'t run again
    update_post_meta( $post_id, \'emailsent\', true );
}

}
add_action( \'draft_to_publish\', \'notify_growers\' );
add_action( \'new_to_publish\', \'notify_growers\' );
它没有发送任何电子邮件,我也不知道如何调试它。

附带的问题是,在foreach循环中发送电子邮件是最好的方式吗?还是我应该以某种方式与密件抄送同时完成这一切?

谢谢,安格斯

2 个回复
SO网友:bueltge

您还可以在函数内部进行调试。使用WordPress默认函数在瞬态中写入变量的数据,如set_transient() 或在浏览器控制台中调试。您可以使用插件Debug Objects 用于在Chrome中从php写入Webinspector控制台。

也许添加一个exit(); 在结束括号之前,使用函数通过php创建输出,如var_dump() 并停止该功能,以便在屏幕上更轻松地阅读。

您可以在source in this plugin file, 使用wp_mail() 还可用于通知职位的工作。也许这是一个小小的帮助,看看怎么可能。

SO网友:Adam

你知道你的wp_mail() 功能是否正常工作?你知道你的功能是否在链的更高层失败了吗?

我会像这样重新编写函数,这使得它更容易阅读,也更高效,因为我们只运行我们绝对需要满足特定条件的函数。

此外,我已删除get_field() 函数调用,它只是get_post_meta().

存储$post_id = $post->ID 也被删除了,因为在这个阶段,不需要出于任何特定原因操纵或缓存ID,所以它只是稍微清理一下。

如果你知道specific_users 自定义字段返回序列化数组,然后可以添加true 参数后的meta_key 要接收回未序列化的数组,请忽略true 价值

isset 将返回true,即使数组为空,并且如果数组中没有结果,WordPress实际上将返回空数组,除非true 参数设置为在这种情况下将返回空字符串,因此调用isset 已删除并替换为!empty($array).

从这一点上,您可以更轻松地调试函数。。。

function notify_growers($post) {
    //if NOT post type \'grower_posts\' then exit;
    if ( $post->post_type != \'grower_posts\' ) 
         return;

    //if email already sent then exit.
    if ( get_post_meta( $post->ID, \'emailsent\', true ) )
         return;

    //if email not sent then get an array of users to email
    $specific_users = get_post_meta($post->ID, \'specific_users\');

    //if $specific_users is an array and is not empty then send email. 
    if(is_array($specific_users) && !empty($specific_users)) { 
        foreach($specific_users as $specific_user) {
            //add mail logic here, $to, $subject, $message
            wp_mail($to, $subject, $message );
        }
        unset($specific_user);

        //prevent emails from being sent by updating post meta field
        update_post_meta( $post->ID, \'emailsent\', true );
    }   

}

add_action( \'draft_to_publish\', \'notify_growers\' );
add_action( \'new_to_publish\', \'notify_growers\' );

结束

相关推荐

如何覆盖AJAX响应的WP_DEBUG?

强烈建议(我完全同意)采用WP_DEBUG 已启用。然而,在页面中看到尚未修复的警告很不方便,但在Ajax响应中,它们会完全破坏响应。我只是从WP中的Ajax开始,是否有一些合适的钩子仅用于抑制Ajax响应的错误?PS fix everything目前还不可行,因为它的环境极其广泛和复杂:)