Ga naar inhoud

PrimoCRM uitbreiden

Alles wat uitbreidbaar is in PrimoCRM wordt verzameld via een WordPress-filter, zodat je add-on hierop registreert zonder dat er wijzigingen in de core nodig zijn. Dit zijn dezelfde patronen die de officiële Pro-functies gebruiken. Bekijk de volledige lijst in Acties en Filters.

De eenvoudigste uitbreiding is reageren op iets dat is gebeurd. Gebruik hiervoor de actiehooks.

add_action( 'primocrm_contact_tag_added', function ( $contact_id, $tag_id ) {
// Synchroniseer de tagwijziging met een extern systeem.
}, 10, 2 );

Een aangepast formulierveldtype registreren

Section titled “Een aangepast formulierveldtype registreren”

Voeg een klasse toe die de veldinterface implementeert en registreer deze vervolgens bij primocrm_form_field_types.

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

Jouw klasse implementeert dezelfde interface als de standaard veldtypes (een type()-methode en logica voor renderen en opschonen). Gebruik de ingebouwde velden onder includes/modules/forms/Fields/Types als referentie. Het nieuwe type verschijnt vervolgens in het palet van de formulierbouwer. Zie Veldtypes.

Een migratiebron leest één extern systeem en normaliseert dit naar PrimoCRM-contacten, -lijsten, -tags en aangepaste velden. Implementeer het broncontract en registreer dit bij primocrm_migration_sources.

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

Het register verwijdert automatisch alles wat de broninterface niet implementeert, zodat een defecte add-on de importfunctie niet kan laten crashen. De gratis plugin wordt geleverd met CSV- en FluentCRM-bronnen als referentie. Zie Vanuit een andere CRM.

Het verzenden wordt geleid via het primocrm_smtp_send-filter. Geef een true-waardig resultaat terug om aan te geven dat je de verzending hebt afgehandeld, een WP_Error bij een fout, of de binnenkomende waarde om de verzending door te sturen. Dit is precies hoe de Pro ESP-providers integrepen.

add_filter( 'primocrm_smtp_send', function ( $result, $provider, $atts, $settings ) {
if ( $provider !== 'myesp' ) {
return $result; // niet van ons; laat de volgende handler beslissen
}
$ok = my_esp_send( $atts['to'], $atts['subject'], $atts['message'], $settings );
return $ok ? true : new WP_Error( 'myesp_failed', 'Verzenden mislukt' );
}, 10, 4 );

Wanneer geen enkele handler de verzending claimt, valt PrimoCRM terug op de standaard WordPress-mailer, zodat een niet-geconfigureerde of verlopen site toch berichten blijft bezorgen. Zie Verzenden en E-mailbezorging.

Velden en operators voor de voorwaardenbouwer toevoegen

Section titled “Velden en operators voor de voorwaardenbouwer toevoegen”

Breid de automatiseringsvoorwaardenbouwer uit door te filteren op primocrm_condition_options. De waarde bevat een fields-array en een operators-array.

add_filter( 'primocrm_condition_options', function ( $opts ) {
$opts['fields'][] = [
'key' => 'life_time_value',
'label' => 'Lifetime value',
'type' => 'number',
];
$opts['operators'][] = [ 'key' => '>', 'label' => 'Groter dan' ];
return $opts;
} );

Dit is hoe Pro zijn commerce-velden toevoegt. Zie Voorwaarden en Vertakkingen.

Triggers worden verzameld via primocrm_automation_triggers en verschijnen in de automatiseringskiezer. De ondersteunde manier is om BaseTrigger te uitbreiden, die zichzelf automatisch registreert voor dat filter. Dit is precies hoe de ingebouwde integraties voor Contact Form 7, WPForms en Fluent Forms werken.

Breid BaseTrigger uit, stel een unieke triggerName in, beschrijf de trigger in getTrigger() en haak in op je eigen gebeurtenis. Wanneer de gebeurtenis plaatsvindt, los je het contact op en voeg je dit toe aan elke automatisering die jouw trigger gebruikt.

use PrimoCRM\modules\automations\Triggers\BaseTrigger;
use PrimoCRM\modules\automations\Triggers\Forms\ResolvesContactFromForm;
use PrimoCRM\modules\automations\AutomationProcessor;
class SuperFormsSubmittedTrigger extends BaseTrigger
{
use ResolvesContactFromForm; // zoek of maak een contact op basis van e-mail
public function __construct()
{
$this->triggerName = 'superforms_submitted';
$this->actionArgNum = 1;
parent::__construct(); // registreert zichzelf automatisch bij primocrm_automation_triggers
// Haak in op de verzendactie van je EIGEN formulierplugin:
add_action( 'superforms_after_submit', [ $this, 'onSubmit' ], 10, 1 );
}
// Metadata die de trigger vermeldt in de automatiseringskiezer.
public function getTrigger()
{
return [
'category' => 'Formulieren',
'label' => 'SuperForms ingediend',
'description' => 'Wordt geactiveerd wanneer een SuperForms-formulier wordt ingediend',
'icon' => 'document-text',
];
}
public function onSubmit( $submission )
{
$email = $submission['email'] ?? '';
$first = $submission['first_name'] ?? '';
$last = $submission['last_name'] ?? '';
// Los het contact op of maak het aan (activeert primocrm_contact_created bij aanmaak).
$contact_id = $this->resolveContactFromForm( $email, $first, $last, 'superforms' );
if ( ! $contact_id ) {
return;
}
// Voeg het contact toe aan elke actieve automatisering die deze trigger gebruikt.
$processor = AutomationProcessor::getInstance();
foreach ( $processor->findAutomationsByTrigger( $this->triggerName ) as $automation ) {
$processor->enterContact( $automation->id, $contact_id, $this->triggerName );
}
}
public function handle( ...$args ) {}
}
// Instantieer eenmalig, nadat je formulierplugin is geladen, zodat deze zichzelf registreert.
add_action( 'plugins_loaded', function () {
new SuperFormsSubmittedTrigger();
}, 20 );

Jouw trigger verschijnt nu in de automatiseringsbouwer, en een inzending maakt of werkt het PrimoCRM-contact bij en voert alle bijbehorende automatiseringen uit.

Wanneer de hostplugin niet is geïnstalleerd

Section titled “Wanneer de hostplugin niet is geïnstalleerd”

Er hoeft niets te worden ontgrendeld: een geregistreerde trigger is een werkende trigger. Wat je wel moet opvangen is de afwezigheid van je eigen hostplugin. Registreer de trigger toch en geef deze een requires_plugin-tekenreeks mee, zodat PrimoCRM deze als onbeschikbaar weergeeft en aangeeft wat er nodig is, in plaats van een stille leegte achter te laten in de kiezer:

add_filter( 'primocrm_automation_triggers', function ( $triggers ) {
if ( isset( $triggers['superforms_submitted'] ) || defined( 'SUPERFORMS_VERSION' ) ) {
return $triggers;
}
$triggers['superforms_submitted'] = array(
'label' => 'Super Forms ingediend',
'category' => 'Formulieren',
'description' => 'Wordt geactiveerd wanneer een Super Forms-formulier wordt ingediend',
'requires_plugin' => 'Super Forms',
);
return $triggers;
}, 99 );

Voer dit uit met een lage prioriteit zodat de echte trigger, geregistreerd op 10, altijd wint.

Aangepaste acties volgen dezelfde structuur voor primocrm_automation_actions (breid de basisactieklasse uit, beschrijf deze en implementeer de stap). Gebruik de core-acties onder includes/modules/automations/Actions als werkende referenties. Dezelfde requires_plugin-regel is van toepassing wanneer je actie een hostplugin nodig heeft.

Als het integrerende systeem niet op dezelfde WordPress-site draait, gebruik dan de REST API in plaats van een triggerklasse. Maak een contact aan of werk er een bij met een geauthenticeerde POST /wp-json/primocrm/v1/contacts. Schrijf niet rechtstreeks naar de databasetabellen van PrimoCRM; het REST-eindpunt en de triggerklassen zijn de ondersteunde interfaces en zorgen ervoor dat je integratie blijft werken na updates.

De admin-app is een React Single Page Application, en wp.hooks-filters zijn de manier om je eigen schermen daarin te plaatsen. Er zijn koppelpunten voor tabbladen voor Instellingen, Rapportage, acties voor campagnerijen, stappen van de campagne-wizard, detailvensters voor campagnes en e-maileditors, die allemaal worden vermeld in Acties en Filters.

Elk punt retourneert descriptoren met koppelings-callbacks (mount callbacks) in plaats van React-elementen, zodat je UI in zijn eigen root wordt gerenderd en jouw React-versie niet hoeft te matchen met die van PrimoCRM. Voeg geen losse beheagina toe; gebruik de koppelpunten, zodat jouw functie verschijnt op de plek waar de gebruiker al aan het werk is.