たとえば、「@ Davidがbla blahについて私に話してくれた女の子にやっと会ったので、今日は嬉しいです。」という内容の新しい投稿を作成します。投稿が公開されると、Davidに電子メール通知が送信されます。彼について言及しているこの記事についてそのようなプラグインはもうありますか?そうでなければ私の実装を手伝ってください。どうもありがとうございました! :)
スクリプトは最初にこの新しい投稿の内容を解析する必要があります。 '@'の後に名前を見つけ、それから彼/彼女のEメールアドレスを得るためにコメント投稿者の名前と一致するようにデータベースに行きます(私が@以前に私のブログにコメントを持っていなければならないと仮定)
基本的なEメール送信部分は以下のとおりです。
function email_friend() {
$postTitle = get_the_title($id);
$post_permalink = get_permalink( $id );
$to = '[email protected]';
$subject = 'Arch!tect mentioned you in his new post《'.$postTitle .'》';
$from = "[email protected]";
$headers = "From:" . $from;
$message = "Arch!tect mentioned you in his new post《".$postTitle .
"》 check it out?\n\n" ."Post link:".$post_permalink
."\n\n\nPlease don't reply this email.\r\n";
mail($to, $subject, $message, $headers);
}
add_action ( 'publish post', 'email_friend' );
簡単な部分で終わりました!
さて、難しい部分で助けてください…投稿中の名前の解析とデータベース中の電子メールアドレスの取得。
P.S.
助けてくれてありがとう!私はなんとかコードを完成させることができました、そして、それは今うまく働いています(テスト済み)。名前の中にスペースが入っている人を言うために、私は最初にアンダースコアを使用してからスペースに戻します。それは今私が私のポストで言及したことをすべての人々に電子メールを送り、それをした後それは結果と共に私自身に要約を送るでしょう。以下に完全なコードを貼り付けてみましょう。よく見て、改善点について教えてください。
function email_friend() {
// get post object
$post = get_post($id);
// get post content
$content = $post->post_content;
// get how many people is mentioned in this post
//$mentionCount = preg_match_all('/(@(\w)+)/', $content, $matches);
$mentionCount = preg_match_all('/(@[^\s]+)/', $content, $matches);//support other lang
// if there is at least one @ with a name after it
if (0 !== $mentionCount) {
$friendList = array();//for storing correct names
for ($mentionIndex=0; $mentionIndex < $mentionCount; $mentionIndex++) {
$mentionName = $matches[0][$mentionIndex];
$mentionName = str_replace('_',' ',$mentionName); //change _ back to space
$mentionName = substr($mentionName, 1); //get rid of @
//for security and add wildcard
$friend_display_name_like = '%' . like_escape($mentionName) . '%';
global $wpdb;
// get correct name first
$friendCorrectName = $wpdb->get_var( $wpdb->prepare( "
SELECT comment_author
FROM $wpdb->comments
WHERE comment_author
LIKE %s ",
$friend_display_name_like
)) ;
// get friend email by comment author name
$friend_email = $wpdb->get_var( $wpdb->prepare( "
SELECT comment_author_email
FROM $wpdb->comments
WHERE comment_author
LIKE %s ",
$friendCorrectName
)) ;
if($friend_email) {// if found email address then email
$postTitle = get_the_title($id);
$post_permalink = get_permalink( $id );
$to = $friend_email;
$subject = 'Arch!tect mentioned you in his new post 《'.$postTitle .
'》';
$from = "[email protected]";
$headers = "From:" . $from;
$message = "Arch!tect mentioned you in his new post《".$postTitle .
"》 check it out?\n\n" ."Post link:".$post_permalink
."\n\n\nPlease don't reply this email.\r\n";
if(mail($to, $subject, $message, $headers)) {
//if send successfully put his/her name in my list
array_Push($friendList, $friendCorrectName);
//array_Push($friendList, $friend_email);
}
}
}
$comma_separated = implode(",", $friendList); //friend list array to string
// now send an email to myself about the result
$postTitle = get_the_title($id);
$post_permalink = get_permalink( $id );
$to = '[email protected]';
$subject = "Your new post《".$postTitle .
"》has notified ".count($friendList)."friends successfully";
$from = "[email protected]";
$headers = "From:" . $from;
//list all friends that received my email
$message = "Your new post《".$postTitle .
"》has notified ".count($friendList)."friends successfully:\n\n".$comma_separated ;
mail($to, $subject, $message, $headers);
}
}//end of email_friend function
add_action ( 'publish_post', 'email_friend' );
編集:(\ w)+を[^\s] +に変更し、より多くの言語をサポートするようにしました。 (中国語テスト済み)
Kaiserの提案に従って2回編集、安全でないバージョンは削除されました。
<?php
function my_email_friend($post_id = '') {
// get post object
$post = get_post($post_id);
// get post content
$content = $post->post_content;
// if @David exists
if( 0 !== preg_match('/(@\w)/', $content, $matches) )
$friend_display_name_like = '%' . like_escape($matches[0]) . '%';
else
return; // do nothing if no matches
global $wpdb;
// get friend email by 'display_name'
$friend_email = $wpdb->get_var( $wpdb->prepare( "
SELECT user_email
FROM $wpdb->users
WHERE display_name
LIKE %s ",
$friend_display_name_like
)) ;
if($friend_email) {
/* Your code here, 'mail()' can use '$friend_email' */
}
}
add_action('publish_post', 'my_email_friend');
出発点としてのみ使用してください。
John Doe
とJohn Roe
の両方から1つのJohn
のみがEメールで送信されます。すべてが強化されていますが、テストする準備ができているようです。