Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 13 additions & 11 deletions includes/class-accepted-actions.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,18 @@ class Accepted_Actions {
* @var array Array where the keys are the supported events and the values are the Incoming Events class names
*/
const ACTIONS = [
'reader_registered' => 'Reader_Registered',
'newspack_node_order_changed' => 'Order_Changed',
'newspack_node_subscription_changed' => 'Subscription_Changed',
'canonical_url_updated' => 'Canonical_Url_Updated',
'donation_new' => 'Donation_New',
'donation_subscription_cancelled' => 'Donation_Subscription_Cancelled',
'network_user_updated' => 'User_Updated',
'network_user_deleted' => 'User_Deleted',
'newspack_network_woo_membership_updated' => 'Woocommerce_Membership_Updated',
'network_manual_sync_user' => 'User_Manually_Synced',
'network_nodes_synced' => 'Nodes_Synced',
'reader_registered' => 'Reader_Registered',
'newspack_node_order_changed' => 'Order_Changed',
'newspack_node_subscription_changed' => 'Subscription_Changed',
'canonical_url_updated' => 'Canonical_Url_Updated',
'donation_new' => 'Donation_New',
'donation_subscription_cancelled' => 'Donation_Subscription_Cancelled',
'network_user_updated' => 'User_Updated',
'network_user_deleted' => 'User_Deleted',
'newspack_network_woo_membership_updated' => 'Woocommerce_Membership_Updated',
'network_manual_sync_user' => 'User_Manually_Synced',
'network_nodes_synced' => 'Nodes_Synced',
'newspack_network_membership_plan_updated' => 'Membership_Plan_Updated',
];

/**
Expand All @@ -59,5 +60,6 @@ class Accepted_Actions {
'network_manual_sync_user',
'network_nodes_synced',
'newspack_node_subscription_changed',
'newspack_network_membership_plan_updated',
];
}
75 changes: 75 additions & 0 deletions includes/cli/backfillers/class-membership-plan-updated.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php
/**
* Data Backfiller for membership_plan_updated events.
*
* @package Newspack
*/

namespace Newspack_Network\Backfillers;

use Newspack_Network\Data_Backfill;
use Newspack_Network\Woocommerce_Memberships\Admin as Memberships_Admin;
use Newspack_Network\Woocommerce_Memberships\Events as Memberships_Events;
use WP_Cli;
use WC_Memberships_Membership_Plan;

/**
* Backfiller class.
*/
class Membership_Plan_Updated extends Abstract_Backfiller {

/**
* Gets the output line about the processed item being processed in verbose mode.
*
* @param \Newspack_Network\Incoming_Events\Abstract_Incoming_Event $event The event.
*
* @return string
*/
protected function get_processed_item_output( $event ) {
return sprintf( 'Membership Plan #%d', $event->get_id() );
}

/**
* Gets the events to be processed
*
* @return \Newspack_Network\Incoming_Events\Abstract_Incoming_Event[] $events An array of events.
*/
public function get_events() {

if ( ! class_exists( 'WC_Memberships_Membership_Plan' ) ) {
return [];
}

// Get all memberships created or updated between $start and $end.
$membership_plans = get_posts(
[
'post_type' => Memberships_Admin::MEMBERSHIP_PLANS_CPT,
'post_status' => 'any',
'numberposts' => -1,
'date_query' => [
'column' => 'post_modified_gmt',
'after' => $this->start,
'before' => $this->end,
'inclusive' => true,
],
]
);

$this->maybe_initialize_progress_bar( 'Processing membership plans', count( $membership_plans ) );

$events = [];
WP_CLI::line( '' );
WP_CLI::line( sprintf( 'Found %s membership plan(s) eligible for sync.', count( $membership_plans ) ) );
WP_CLI::line( '' );

foreach ( $membership_plans as $plan ) {
$membership_data = Memberships_Events::membership_plan_updated( $plan->ID );

$timestamp = strtotime( $plan->post_modified_gmt );

$events[] = new \Newspack_Network\Incoming_Events\Membership_Plan_Updated( get_bloginfo( 'url' ), $membership_data, $timestamp );
}

return $events;
}
}
116 changes: 116 additions & 0 deletions includes/incoming-events/class-membership-plan-updated.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
<?php
/**
* Newspack Hub Membership Plan Updated Incoming Event class
*
* @package Newspack
*/

namespace Newspack_Network\Incoming_Events;

use Newspack_Network\Hub\Stores\Subscriptions;
use Newspack_Network\Debugger;

/**
* Class to handle the Membership Plan Updated Incoming Event
*/
class Membership_Plan_Updated extends Woo_Item_Changed {

const OPTION_NAME = 'newspack_network_membership_plans';

/**
* Processes the event
*
* @return void
*/
public function post_process_in_hub() {
$this->update_option();
}

/**
* Process event in Node
*
* @return void
*/
public function process_in_node() {
$this->update_option();
}

/**
* Updates the user meta with the subscription data
*
* @return void
*/
public function update_option() {

Debugger::log( 'Processing membership_plan_Updated ' );

$current_value = get_option( self::OPTION_NAME, [] );

if ( ! is_array( $current_value ) ) {
$current_value = [];
}

if ( ! isset( $current_value[ $this->get_site() ] ) ) {
$current_value[ $this->get_site() ] = [];
}

$current_value[ $this->get_site() ][ $this->get_id() ] = [
'id' => $this->get_id(),
'name' => $this->get_name(),
'slug' => $this->get_slug(),
'network_id' => $this->get_network_id(),
'products' => $this->get_products(),

];

update_option( self::OPTION_NAME, $current_value );
}

/**
* Returns the id property
*
* @return ?int
*/
public function get_id() {
return $this->data->id ?? null;
}

/**
* Returns the name property
*
* @return ?string
*/
public function get_name() {
return $this->data->name ?? null;
}

/**
* Returns the slug property
*
* @return ?string
*/
public function get_slug() {
return $this->data->slug ?? null;
}

/**
* Returns the network_id property
*
* @return ?string
*/
public function get_network_id() {
return $this->data->network_id ?? null;
}

/**
* Returns the products property
*
* This is an array of products included in the subscription.
* Each product has an id, a name and a slug.
*
* @return array
*/
public function get_products() {
return $this->data->products ?? [];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public function update_membership() {
"SELECT post_id from $wpdb->postmeta WHERE meta_key = %s AND meta_value = %s AND post_id IN ( SELECT ID FROM $wpdb->posts WHERE post_type = %s ) ",
Memberships_Admin::NETWORK_ID_META_KEY,
$this->get_plan_network_id(),
Memberships_Admin::MEMBERSHIPS_CPT
Memberships_Admin::MEMBERSHIP_PLANS_CPT
)
);

Expand Down
17 changes: 13 additions & 4 deletions includes/woocommerce-memberships/class-admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class Admin {
*
* @var string
*/
const MEMBERSHIPS_CPT = 'wc_membership_plan';
const MEMBERSHIP_PLANS_CPT = 'wc_membership_plan';

/**
* The network id meta key.
Expand Down Expand Up @@ -150,7 +150,7 @@ public static function add_meta_box() {
'newspack-network-memberships-meta-box',
__( 'Newspack Network', 'newspack-network' ),
array( __CLASS__, 'render_meta_box' ),
self::MEMBERSHIPS_CPT,
self::MEMBERSHIP_PLANS_CPT,
'advanced'
);
}
Expand Down Expand Up @@ -178,9 +178,11 @@ public static function render_meta_box( $post ) {
*/
public static function save_meta_box( $post_id ) {

$post_type = sanitize_text_field( $_POST['post_type'] ?? '' );
$post = get_post( $post_id );

if ( self::MEMBERSHIPS_CPT !== $post_type ) {
$post_type = $post->post_type;

if ( self::MEMBERSHIP_PLANS_CPT !== $post_type ) {
return;
}

Expand All @@ -205,6 +207,13 @@ public static function save_meta_box( $post_id ) {
$network_id = self::unique_network_id( $network_id, $post_id );

update_post_meta( $post_id, self::NETWORK_ID_META_KEY, $network_id );

/**
* Triggers an action when a membership plan is saved.
*
* @param int $post_id The post ID of the membership plan.
*/
do_action( 'newspack_network_save_membership_plan', $post_id );
}

/**
Expand Down
33 changes: 32 additions & 1 deletion includes/woocommerce-memberships/class-events.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
namespace Newspack_Network\Woocommerce_Memberships;

use Newspack\Data_Events;
use WC_Memberships_Membership_Plan;

/**
* Fire the events for Woocommerce Memberships
Expand Down Expand Up @@ -47,6 +48,7 @@ public static function register_listeners() {
Data_Events::register_listener( 'wc_memberships_user_membership_status_changed', 'newspack_network_woo_membership_updated', [ __CLASS__, 'membership_granted' ] );
Data_Events::register_listener( 'wc_memberships_user_membership_deleted', 'newspack_network_woo_membership_updated', [ __CLASS__, 'membership_deleted' ] );
Data_Events::register_listener( 'wc_memberships_user_membership_saved', 'newspack_network_woo_membership_updated', [ __CLASS__, 'membership_revoked' ] );
Data_Events::register_listener( 'newspack_network_save_membership_plan', 'newspack_network_membership_plan_updated', [ __CLASS__, 'membership_plan_updated' ] );
}

/**
Expand Down Expand Up @@ -120,7 +122,7 @@ public static function membership_revoked( $plan, $args ) {
}

// When creating the membership via admin panel, this hook is called once before the membership is actually created.
if ( ! $plan instanceof \WC_Memberships_Membership_Plan ) {
if ( ! $plan instanceof WC_Memberships_Membership_Plan ) {
return;
}

Expand Down Expand Up @@ -157,4 +159,33 @@ public static function membership_revoked( $plan, $args ) {
'new_status' => $user_membership->get_status(),
];
}

/**
* Triggers a data event when the membership plan is updated
*
* @param int $plan_id The ID of the membership plan.
* @return array
*/
public static function membership_plan_updated( $plan_id ) {
$plan = new WC_Memberships_Membership_Plan( $plan_id );
$data = [
'id' => $plan->get_id(),
'network_id' => get_post_meta( $plan->get_id(), Admin::NETWORK_ID_META_KEY, true ),
'name' => $plan->get_name(),
'slug' => $plan->get_slug(),
'products' => [],
];

$products = $plan->get_products();

foreach ( $products as $product ) {
$data['products'][ $product->get_id() ] = [
'id' => $product->get_id(),
'name' => $product->get_name(),
'slug' => $product->get_slug(),
];
}

return $data;
}
}