web-dev-qa-db-ja.com

友達に新しい投稿を通知するプラグインを書く(@)

たとえば、「@ 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] +に変更し、より多くの言語をサポートするようにしました。 (中国語テスト済み)

5
Arch1tect

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');

出発点としてのみ使用してください。

  • コードは部分的にテストされています(読み取り:未テスト)。
  • あなたは投稿に多くの友達を挙げることができます、最初に言及された人は通知されます(強化されるかもしれません)
  • 投稿内容に[email protected]のようなものを含めることができます。スクリプトは 'example'ユーザーを見つけようとします。
  • John DoeJohn Roeの両方から1つのJohnのみがEメールで送信されます。

すべてが強化されていますが、テストする準備ができているようです。

3
Max Yudin