Je voudrais faire ce qui suit:
Les utilisateurs enregistrés dans mon application wordpress peuvent recevoir des messages. Ils peuvent choisir de recevoir des messages des manières suivantes:
Je voudrais utiliser le plugin Front End PM pour envoyer des messages dans le portail. Pour les messages SMS, je voudrais utiliser le plugin Twilio .
Donc, quand ils ont envoyé un message (fonctionnalité par le plugin Front end PM), j'aimerais appeler une autre fonction du plugin Twilio pour envoyer un SMS.
Quelle est la bonne façon de faire cela? Je ne pense pas que l’édition de la fonction dans le plugin Front End PM soit la bonne façon de faire cela? Comment devrait-il être fait?
Levi Dulstein a beaucoup de droits, mais à mon avis, Front-end-pm utilise deux hooks pour envoyer des messages:
Avant d'envoyer un courrier électronique, peu de choses sont vérifiées, comme le statut de publication ou d'envoi (includes/class-fep-emails.php):
function save_send_email( $postid, $post ) {
if ( ! $post instanceof WP_Post ) {
$post = get_post( $postid );
}
if ( 'publish' != $post->post_status ){
return;
}
if ( get_post_meta( $postid, '_fep_email_sent', true ) ){
return;
}
$this->send_email( $postid, $post );
}
Donc, pour le test, ajoutez quelque chose comme ceci à votre plugin ou à votre thème:
function send_sms( $postid, $post ) {
if ( ! $post instanceof WP_Post ) {
$post = get_post( $postid );
}
if ( 'publish' != $post->post_status ){
return;
}
if ( get_post_meta( $postid, '_fep_email_sent', true ) ){
return;
}
// use Twilio plugin function twl_send_sms
if( function_exists('twl_send_sms') ) {
$participants = fep_get_participants( $postid );
// check if recipients exists, for each get the phone number,
// send message and mark sms as sent (or save sms send time)
$args = array(
'message' => $post->post_title, // or $post->post_content
);
foreach ($participants as $participant) {
// get usermeta with phone number for $participant ID
$args['number_to'] = '098765';
twl_send_sms( $args );
}
}
}
add_action( 'fep_save_message', 'send_sms', 99, 2 ); //sending from back-end
add_action( 'fep_action_message_after_send , 'send_sms', 99, 2 ); //front-end
Désolé pour mon anglais. J'espère que vous comprenez ce que je veux dire.
J'ai jeté un coup d'oeil aux docs des deux plugins et il semble que c'est ce dont vous avez besoin qui peut être fait relativement facilement, puisque les deux plugins fournissent des crochets d'action Nice ici et là.
Selon WP Twilio docs, vous devriez être en mesure "d'envoyer un message texte sur pratiquement n'importe quelle action WordPress" et même de donner un simple exemple de la procédure à suivre. J'essaierais d'utiliser cette fonction et de la relier à l'action de l'autre plugin.
En ce qui concerne le plug-in Front End PM, il semble y avoir un crochet d'action n ice :
do_action( 'fep_action_message_after_send', $message_id, $message, $inserted_message );
Il est exécuté chaque fois qu'un message est enregistré dans la base de données après avoir utilisé l'interface utilisateur frontale. Il semble donc être l'endroit idéal pour vous connecter à la fonction d'envoi.SMS. , plutôt cool, nous allons utiliser ça!
Donc pour résumer, je voudrais essayer quelque chose comme ça:
Créez une fonction qui envoie un SMS en utilisant l'exemple de Twilio, tous les arguments sont extraits du hook mentionné ci-dessus:
function send_sms_with_twilio( $message_id, $message, $inserted_message ){
// Now the $message should be an array with Front End PM data,
// so just check the plugin's code to determine what data you want to pass to a text message.
// i'll do a simple example:
$sms_message = '';
if ( is_array( $message ) && ! empty( $message['message_title'] ) ) {
$sms_message = sprintf( 'Hello mate, you have received a new PM titled "%s"', esc_html( $message['message_title'] ) );
}
// [message_to_id] key should contain WP users ID's, again - you should doublecheck that
$receivers = ! empty( $message['message_to_id'] ) ? (array) $message['message_to_id'] : [];
// Now I'm not sure where you keep phone numbers, but let's assume it's in user's meta, so I'll try this
// assuming 'phone_number' is right meta key:
foreach( $receivers as $receiver ){
$to = get_user_meta( $receiver, 'phone_number', true );
// Let's send this message finally! But only if we have a number and text.
// you probably should do some additional validation here
// to make sure that the phone number is properly formatted.
if ( empty( $to ) || empty( $sms_message ) ) {
return;
}
// this is Twilo's plugin function
twl_send_sms( [
'number_to' => $to,
'message' => $sms_message,
] );
}
}
Maintenant, vous pouvez accrocher votre fonction à celle de Front End PM:
add_action( 'fep_action_message_after_send', 'send_sms_with_twilio', 100, 3 );
Gardez à l'esprit que ce que je fais ici n'est qu'un brouillon rapide basé sur ce que j'ai vu dans le code des plugins. Je ne l'ai pas testé, mais il devrait vous donner une idée générale de la façon de régler votre problème.
La question peut être de savoir où placer ce code - je pense que vous pouvez essayer dans le functions.php
de votre thème, mais uniquement à des fins de test et lorsque vous êtes sûr que les deux plugins sont actifs. Pour les besoins de la production, je le séparerais en tant que troisième plugin et utiliserais la fonction is_plugin_active () pour vérifier que toutes les dépendances sont en place.
Disclaimer: Je suis un développeur relativement nouveau et ne connais pas ces plugins, mes suggestions sont donc générales.
Vous avez raison de ne pas éditer les fonctions existantes.
Mon idée serait de créer votre propre plug-in et de vérifier s'il existe des points d'ancrage que vous pouvez attacher dans le plug-in Front End PM. Voyez si vous pouvez ajouter un filtre (?) Pour superposer la fonction Twilo à celle-ci.
Vous aurez besoin de votre test de plug-in pour vous assurer que les deux autres plug-ins sont disponibles avant d'essayer de s'exécuter.
Mon instinct me dit que cela serait extrêmement instable, cependant.
Réponse moins utile, mais peut-être meilleure à long terme: envisagez de contacter les développeurs de ces plugins pour voir s'ils ont des idées.
Bonne chance!