web-dev-qa-db-fra.com

Comment modifier le contenu d'un message avant d'écrire dans la base de données?

Bonjour ~ Je suis de retour et j'essaye d'ajouter une autre fonction au script sur lequel je travaillais un plugin qui informe mes amis du nouveau message qui les mentionne (@) . Maintenant, je veux changer le texte en clair du nom de mes amis que j'ai mentionné en un lien vers leur propre adresse de blog wordpress (si tel est le cas) une fois que j'ai cliqué sur publier. Donc, David deviendra David .

Je cherche cette question plusieurs fois mais tous les résultats sont comme suit:

add_filter('the_content', 'replace_custom_Word');

qui ne modifie pas vraiment la base de données, non? Edit: Je ne sais pas, peut-être que je me trompe.

Vous trouverez ci-dessous le code que je vais utiliser pour obtenir l'adresse du blog de David.

        $friend_url = $wpdb->get_var( $wpdb->prepare( "

                                                       SELECT comment_author_url
                                                       FROM $wpdb->comments
                                                       WHERE comment_author
                                                       LIKE %s ",
                                                       $friendCorrectName
                                                       )) ;

Alors s'il vous plaît dites-moi quelle est la meilleure façon de le faire. Merci beaucoup d'avance!

Le code complet de ce script est également collé ci-dessous. N'hésitez pas à commenter ce que j'ai maintenant. :) Vous pouvez consulter mon dernier message si vous voyez quelque chose de bizarre, ou vous pouvez simplement me demander.

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('/(@[^\s]+)/', $content, $matches);


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

            // get friend's blog address
            $friend_url = $wpdb->get_var( $wpdb->prepare( "

                                                       SELECT comment_author_url
                                                       FROM $wpdb->comments
                                                       WHERE comment_author
                                                       LIKE %s ",
                                                       $friendCorrectName
                                                       )) ;

            //if we have David's blog address in database
            if ($friend_url) {


                //this is where I need help with. 
                //I need to modify post content before writing it into database now
                //I need to change the plain text name after @ to a link to his blog










            }

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

            } 

        } 
        $comma_separated_list = 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_list;
        mail($to, $subject, $message, $headers);
    }

}//end of email_friend function

add_action ( 'publish_post', 'email_friend' );

EDIT2: pour être plus précis, le code ci-dessus où je commente "// C’est là que j’ai besoin d’aide." Est l’endroit où j’ai besoin d’aide.

2
Arch1tect

Vous utilisez généralement add_filter avant d'afficher des informations. Pour votre cas, vous pouvez utiliser add_action('publish_post', 'your_function') et ensuite intercepter les valeurs $_POST. Le contenu de l'éditeur WYSIWYG est disponible via $_POST['content'].

Le hook est de type publish_{post_type} btw. Vous devriez changer en conséquence.

Exemple:

function wpse_89292_save_my_post()
{
print_r( $_POST['content'] ); # will display contents of the default wysiwyg editor
die;
}
add_action('publish_post', 'wpse_89292_save_my_post');

Utilisation du filtre wp_insert_post_data:

function wpse_89292_save_my_post( $content ) {
  global $post;
  if( isset($post) && get_post_type( $post->ID ) == 'post' ){
    $content['post_content'] = function_to_manipulate_the_content();
  }
  return $content;
}
add_filter( 'wp_insert_post_data', 'wpse_89292_save_my_posts' );
3
RRikesh

peut-être que vous pouvez utiliser wp_update_post (si vous éditez le post) ou wp_insert_post (s'il s'agit d'un nouveau post) pour éditer ce que vous voulez dans le post. Ça marche vraiment.

0
bigwolk