Skip to content

Commit

Permalink
Merge pull request #685 from ConvertKit/contact-form-7-prefix-form-id…
Browse files Browse the repository at this point in the history
…-settings

Contact Form 7: Prefix Form ID in Settings
  • Loading branch information
n7studios authored Jul 23, 2024
2 parents 5ff3206 + 20b9b98 commit f164930
Show file tree
Hide file tree
Showing 12 changed files with 427 additions and 25 deletions.
1 change: 1 addition & 0 deletions .env.dist.testing
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ CONVERTKIT_API_PRODUCT_NAME="Newsletter Subscription"
CONVERTKIT_API_PRODUCT_ID="36377"
CONVERTKIT_API_PRODUCT_URL="https://cheerful-architect-3237.ck.page/products/newsletter-subscription"
CONVERTKIT_API_PRODUCT_DISCOUNT_CODE=B7G96H637H
CONVERTKIT_API_SEQUENCE_NAME="WordPress Sequence"
CONVERTKIT_API_SEQUENCE_ID="1030824"
CONVERTKIT_API_TAG_NAME="wordpress"
CONVERTKIT_API_TAG_ID="2744672"
Expand Down
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ CONVERTKIT_API_PRODUCT_NAME="Newsletter Subscription"
CONVERTKIT_API_PRODUCT_ID="36377"
CONVERTKIT_API_PRODUCT_URL="https://cheerful-architect-3237.ck.page/products/newsletter-subscription"
CONVERTKIT_API_PRODUCT_DISCOUNT_CODE=B7G96H637H
CONVERTKIT_API_SEQUENCE_NAME="WordPress Sequence"
CONVERTKIT_API_SEQUENCE_ID="1030824"
CONVERTKIT_API_TAG_NAME="wordpress"
CONVERTKIT_API_TAG_ID="2744672"
Expand Down
3 changes: 3 additions & 0 deletions admin/section/class-convertkit-settings-general.php
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,9 @@ public function custom_post_types_callback( $args ) {
$products = new ConvertKit_Resource_Products( 'settings' );
$products->refresh();

$sequences = new ConvertKit_Resource_Sequences( 'settings' );
$sequences->refresh();

$tags = new ConvertKit_Resource_Tags( 'settings' );
$tags->refresh();
}
Expand Down
58 changes: 58 additions & 0 deletions includes/class-convertkit-resource-sequences.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php
/**
* ConvertKit Sequences Resource class.
*
* @package ConvertKit
* @author ConvertKit
*/

/**
* Reads ConvertKit Sequences from the options table, and refreshes
* ConvertKit Sequences data stored locally from the API.
*
* @since 2.5.2
*/
class ConvertKit_Resource_Sequences extends ConvertKit_Resource_V4 {

/**
* Holds the Settings Key that stores site wide ConvertKit settings
*
* @var string
*/
public $settings_name = 'convertkit_sequences';

/**
* The type of resource
*
* @var string
*/
public $type = 'sequences';

/**
* Constructor.
*
* @since 2.5.2
*
* @param bool|string $context Context.
*/
public function __construct( $context = false ) {

// Initialize the API if the Access Token has been defined in the Plugin Settings.
$settings = new ConvertKit_Settings();
if ( $settings->has_access_and_refresh_token() ) {
$this->api = new ConvertKit_API_V4(
CONVERTKIT_OAUTH_CLIENT_ID,
CONVERTKIT_OAUTH_CLIENT_REDIRECT_URI,
$settings->get_access_token(),
$settings->get_refresh_token(),
$settings->debug_enabled(),
$context
);
}

// Call parent initialization function.
parent::init();

}

}
52 changes: 52 additions & 0 deletions includes/class-convertkit-setup.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,13 @@ public function update() {
return;
}

/**
* 2.5.2: Migrate Contact Form 7 to ConvertKit Form Mappings
*/
if ( ! $current_version || version_compare( $current_version, '2.5.2', '<' ) ) {
$this->migrate_contact_form_7_form_mapping_settings();
}

/**
* 2.5.0: Get Access token for API version 4.0 using a v3 API Key and Secret.
*/
Expand Down Expand Up @@ -90,6 +97,51 @@ public function update() {

}

/**
* 2.5.2: Prefix any Contact Form 7 to ConvertKit Form ID mappings with `form_`, now that
* the Plugin supports adding a subscriber to a Form, Tag or Sequence.
*
* @since 2.5.2
*/
private function migrate_contact_form_7_form_mapping_settings() {

$convertkit_contact_form_7_settings = new ConvertKit_ContactForm7_Settings();

// Bail if no settings exist.
if ( ! $convertkit_contact_form_7_settings->has_settings() ) {
return;
}

// Get settings.
$settings = $convertkit_contact_form_7_settings->get();

// Iterate through settings.
foreach ( $settings as $contact_form_7_form_id => $convertkit_form_id ) {
// Skip keys that are non-numeric e.g. `creator_network_recommendations_*`.
if ( ! is_numeric( $contact_form_7_form_id ) ) {
continue;
}

// Skip values that are blank i.e. no ConvertKit Form ID specified.
if ( empty( $convertkit_form_id ) ) {
continue;
}

// Skip values that are non-numeric i.e. the `form_` prefix was already added.
// This should never happen as this routine runs once, but this is a sanity check.
if ( ! is_numeric( $convertkit_form_id ) ) {
continue;
}

// Prefix the ConvertKit Form ID with `form_`.
$settings[ $contact_form_7_form_id ] = 'form:' . $convertkit_form_id;
}

// Update settings.
update_option( $convertkit_contact_form_7_settings::SETTINGS_NAME, $settings );

}

/**
* 2.5.0: Fetch an Access Token, Refresh Token and Expiry for v4 API use
* based on the Plugin setting's v3 API Key and Secret.
Expand Down
7 changes: 5 additions & 2 deletions includes/functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -548,11 +548,14 @@ function convertkit_get_file_contents( $local_file ) {
* @param string $value Field value.
* @param string $id Field ID attribute.
* @param string $css_class Field CSS class(es).
* @param string $context Resource context.
*/
function convertkit_get_subscription_dropdown_field( $name, $value, $id, $css_class = '' ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter
function convertkit_get_subscription_dropdown_field( $name, $value, $id, $css_class = '', $context = '' ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter

// Load resource classes.
$forms = new ConvertKit_Resource_Forms( 'contact_form_7' );
$forms = new ConvertKit_Resource_Forms( $context );
$tags = new ConvertKit_Resource_Tags( $context );
$sequences = new ConvertKit_Resource_Sequences( $context );

ob_start();
include CONVERTKIT_PLUGIN_PATH . '/views/backend/subscription-dropdown-field.php';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,8 @@ public function render() {
'_wp_convertkit_integration_contactform7_settings[' . $cf7_form['id'] . ']',
(string) $this->settings->get_convertkit_subscribe_setting_by_cf7_form_id( $cf7_form['id'] ),
'_wp_convertkit_integration_contactform7_settings_' . $cf7_form['id'],
'widefat'
'widefat',
'contact_form_7'
),
'email' => 'your-email',
'name' => 'your-name',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,29 +129,54 @@ public function handle_wpcf7_submit( $contact_form, $result ) {
'contact_form_7'
);

// If the setting is 'Subscribe', just create the subscriber without assigning to a resource.
if ( $convertkit_subscribe_setting === 'subscribe' ) {
return $api->create_subscriber(
$email,
$first_name
);
// Subscribe the email address.
$subscriber = $api->create_subscriber( $email, $first_name );
if ( is_wp_error( $subscriber ) ) {
return;
}

// For Legacy Forms, a different endpoint is used.
$forms = new ConvertKit_Resource_Forms();
if ( $forms->is_legacy( $convertkit_subscribe_setting ) ) {
return $api->legacy_form_subscribe(
(int) $convertkit_subscribe_setting,
$email,
$first_name
);
// If the setting is 'Subscribe', no Form needs to be assigned to the subscriber.
if ( $convertkit_subscribe_setting === 'subscribe' ) {
return;
}

return $api->form_subscribe(
(int) $convertkit_subscribe_setting,
$email,
$first_name
);
// Determine the resource type and ID to assign to the subscriber.
list( $resource_type, $resource_id ) = explode( ':', $convertkit_subscribe_setting );

// Cast ID.
$resource_id = absint( $resource_id );

// Add the subscriber to the resource type (form, tag etc).
switch ( $resource_type ) {

/**
* Form
*/
case 'form':
// For Legacy Forms, a different endpoint is used.
$forms = new ConvertKit_Resource_Forms();
if ( $forms->is_legacy( $resource_id ) ) {
return $api->add_subscriber_to_legacy_form( $resource_id, $subscriber['subscriber']['id'] );
}

// Add subscriber to form.
return $api->add_subscriber_to_form( $resource_id, $subscriber['subscriber']['id'] );

/**
* Sequence
*/
case 'sequence':
// Add subscriber to sequence.
return $api->add_subscriber_to_sequence( $resource_id, $subscriber['subscriber']['id'] );

/**
* Tag
*/
case 'tag':
// Add subscriber to tag.
return $api->tag_subscriber( $resource_id, $subscriber['subscriber']['id'] );

}

}

Expand Down
34 changes: 34 additions & 0 deletions tests/_support/Helper/Acceptance/ConvertKitAPI.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,41 @@ public function apiCheckSubscriberExists($I, $emailAddress)
// Check at least one subscriber was returned and it matches the email address.
$I->assertGreaterThan(0, $results['pagination']['total_count']);
$I->assertEquals($emailAddress, $results['subscribers'][0]['email_address']);

// Return subscriber ID.
return $results['subscribers'][0]['id'];
}

/**
* Check the given subscriber ID has been assigned to the given sequence ID.
*
* @since 2.5.2
*
* @param AcceptanceTester $I AcceptanceTester.
* @param int $subscriberID Subscriber ID.
* @param int $sequenceID Sequence ID.
*/
public function apiCheckSubscriberHasSequence($I, $subscriberID, $sequenceID)
{
// Run request.
$results = $this->apiRequest(
'sequences/' . $sequenceID . '/subscribers',
'GET'
);

// Iterate through subscribers.
$subscriberHasSequence = false;
foreach ($results['subscribers'] as $subscriber) {
if ($subscriber['id'] === $subscriberID) {
$subscriberHasSequence = true;
break;
}
}

// Assert if the subscriber has the sequence.
$this->assertTrue($subscriberHasSequence);
}

/**
* Check the given subscriber ID has been assigned to the given tag ID.
*
Expand Down
Loading

0 comments on commit f164930

Please sign in to comment.