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