Aller au contenu

Étendre PrimoCRM

Tout ce qui est extensible dans PrimoCRM est collecté via un filtre WordPress, de sorte que votre extension s’y enregistre sans aucune modification du noyau. Ce sont les mêmes motifs qu’utilisent les fonctionnalités Pro natives. Voir la liste complète dans Actions et filtres.

L’extension la plus simple consiste à réagir à quelque chose qui s’est produit. Utilisez les crochets d’action.

add_action( 'primocrm_contact_tag_added', function ( $contact_id, $tag_id ) {
// Synchroniser le changement d'étiquette avec un système externe.
}, 10, 2 );

Enregistrer un type de champ de formulaire personnalisé

Section intitulée « Enregistrer un type de champ de formulaire personnalisé »

Ajoutez une classe qui implémente l’interface de champ, puis enregistrez-la sur primocrm_form_field_types.

add_filter( 'primocrm_form_field_types', function ( $fields ) {
$fields['signature'] = MySignatureField::class;
return $fields;
} );

Votre classe implémente la même interface que les types de champs du noyau (une méthode type() ainsi que la logique de rendu et d’assainissement). Utilisez les champs intégrés dans includes/modules/forms/Fields/Types comme référence. Le nouveau type apparaît ensuite dans la palette du constructeur de formulaires. Voir Types de champs.

Une source de migration lit un système externe et le normalise en contacts, listes, étiquettes et champs personnalisés PrimoCRM. Implémentez le contrat de source et enregistrez-le sur primocrm_migration_sources.

add_filter( 'primocrm_migration_sources', function ( $sources ) {
$sources['mailpoet'] = new MailPoetSource();
return $sources;
} );

Le registre rejette par sécurité tout ce qui n’implémente pas l’interface de source, afin qu’un module défectueux ne puisse pas faire planter l’importateur. L’extension gratuite intègre les sources CSV et FluentCRM comme références. Voir Depuis un autre CRM.

L’envoi est acheminé par le filtre primocrm_smtp_send. Renvoyez un résultat évalué à vrai pour indiquer que vous avez géré l’envoi, un WP_Error en cas d’échec, ou la valeur entrante pour transmettre l’envoi. C’est exactement ainsi que se connectent les fournisseurs ESP Pro.

add_filter( 'primocrm_smtp_send', function ( $result, $provider, $atts, $settings ) {
if ( $provider !== 'myesp' ) {
return $result; // pas le nôtre ; laisser le gestionnaire suivant décider
}
$ok = my_esp_send( $atts['to'], $atts['subject'], $atts['message'], $settings );
return $ok ? true : new WP_Error( 'myesp_failed', 'Send failed' );
}, 10, 4 );

Lorsqu’aucun gestionnaire ne prend en charge l’envoi, PrimoCRM se replie sur le système de messagerie WordPress par défaut, de sorte qu’un site non configuré ou dont la licence a expiré continue d’envoyer des messages. Voir Envoi et délivrabilité.

Ajouter des champs et des opérateurs au constructeur de conditions

Section intitulée « Ajouter des champs et des opérateurs au constructeur de conditions »

Étendez le constructeur de conditions d’automatisation en filtrant primocrm_condition_options. La valeur contient un tableau fields et un tableau operators.

add_filter( 'primocrm_condition_options', function ( $opts ) {
$opts['fields'][] = [
'key' => 'life_time_value',
'label' => 'Valeur à vie',
'type' => 'number',
];
$opts['operators'][] = [ 'key' => '>', 'label' => 'Supérieur à' ];
return $opts;
} );

C’est ainsi que la version Pro ajoute ses champs e-commerce. Voir Conditions et branchement.

Les déclencheurs sont collectés via primocrm_automation_triggers et apparaissent dans le sélecteur d’automatisation. La méthode recommandée consiste à étendre BaseTrigger, qui s’enregistre automatiquement dans ce filtre pour vous. C’est exactement ainsi que fonctionnent les intégrations intégrées Contact Form 7, WPForms et Fluent Forms.

Étendez BaseTrigger, définissez un triggerName unique, décrivez le déclencheur dans getTrigger(), et accrochez votre propre événement. Lorsque l’événement se déclenche, résolvez le contact et insérez-le dans n’importe quelle automatisation utilisant votre déclencheur.

use PrimoCRM\modules\automations\Triggers\BaseTrigger;
use PrimoCRM\modules\automations\Triggers\Forms\ResolvesContactFromForm;
use PrimoCRM\modules\automations\AutomationProcessor;
class SuperFormsSubmittedTrigger extends BaseTrigger
{
use ResolvesContactFromForm; // trouver ou créer un contact par e-mail
public function __construct()
{
$this->triggerName = 'superforms_submitted';
$this->actionArgNum = 1;
parent::__construct(); // s'enregistre automatiquement dans primocrm_automation_triggers
// Accrochez l'action de soumission de VOTRE propre plugin de formulaire :
add_action( 'superforms_after_submit', [ $this, 'onSubmit' ], 10, 1 );
}
// Métadonnées qui listent le déclencheur dans le sélecteur d'automatisation.
public function getTrigger()
{
return [
'category' => 'Forms',
'label' => 'SuperForms Submitted',
'description' => 'Fires when a SuperForms form is submitted',
'icon' => 'document-text',
];
}
public function onSubmit( $submission )
{
$email = $submission['email'] ?? '';
$first = $submission['first_name'] ?? '';
$last = $submission['last_name'] ?? '';
// Résoudre ou créer le contact (déclenche primocrm_contact_created lors de la création).
$contact_id = $this->resolveContactFromForm( $email, $first, $last, 'superforms' );
if ( ! $contact_id ) {
return;
}
// Insérer le contact dans chaque automatisation active utilisant ce déclencheur.
$processor = AutomationProcessor::getInstance();
foreach ( $processor->findAutomationsByTrigger( $this->triggerName ) as $automation ) {
$processor->enterContact( $automation->id, $contact_id, $this->triggerName );
}
}
public function handle( ...$args ) {}
}
// Instancier une seule fois, après le chargement de votre plugin de formulaire, pour qu'il s'enregistre automatiquement.
add_action( 'plugins_loaded', function () {
new SuperFormsSubmittedTrigger();
}, 20 );

Votre déclencheur apparaît désormais dans le constructeur d’automations, et une soumission crée ou met à jour le contact PrimoCRM tout en exécutant toute automatisation correspondante.

Rendre le déclencheur disponible dans l’offre gratuite

Section intitulée « Rendre le déclencheur disponible dans l’offre gratuite »

Les nouvelles clés de déclenchement sont considérées comme Pro par défaut (sécurité par défaut), elles apparaissent donc verrouillées dans l’offre gratuite. Si votre intégration doit fonctionner dans l’offre gratuite, ajoutez sa clé à la liste blanche gratuite :

add_filter( 'primocrm_free_triggers', function ( $keys ) {
$keys[] = 'superforms_submitted';
return $keys;
} );

Les actions personnalisées suivent le même principe avec primocrm_automation_actions (étendez la classe d’action de base, décrivez-la et implémentez son étape). Utilisez les actions du noyau sous includes/modules/automations/Actions comme références fonctionnelles, et ajoutez la clé à primocrm_free_actions si elle doit être gratuite.

Si le système d’intégration ne s’exécute pas sur le même site WordPress, utilisez l’ API REST au lieu d’une classe de déclenchement. Créez ou mettez à jour un contact avec une requête POST /wp-json/primocrm/v1/contacts authentifiée. N’écrivez pas directement dans les tables de base de données de PrimoCRM ; le point de terminaison REST et les classes de déclenchement sont les interfaces prises en charge et garantissent le fonctionnement de votre intégration lors des mises à jour.

Tout ce qui ne figure pas sur la liste blanche gratuite est considéré comme Pro (sécurité par défaut). Si vous ajoutez un déclencheur ou une action qui doit être disponible dans l’offre gratuite, ajoutez sa clé à la liste blanche.

add_filter( 'primocrm_free_triggers', function ( $keys ) {
$keys[] = 'my_custom_trigger';
return $keys;
} );

Le même schéma s’applique à primocrm_free_actions et, pour les limites de quantité, primocrm_free_limits.

Pour ajouter un onglet de paramètres ou une action de ligne de campagne à l’application d’administration, utilisez les filtres wp.hooks JavaScript primocrm.settings.tabs et primocrm.campaigns.rowActions. Ceux-ci renvoient des descripteurs avec des rappels de montage plutôt que des éléments React, afin que votre interface puisse s’afficher dans sa propre racine indépendamment de la version de React. Voir Actions et filtres.