$all[ Memberships::CHANGED ], Memberships::CANCELLED => $all[ Memberships::CANCELLED ], Memberships::LEVEL_SAVED => $all[ Memberships::LEVEL_SAVED ], Memberships::LEVEL_DELETED => $all[ Memberships::LEVEL_DELETED ], ); } public static function register( ?bool $active = null ): void { if ( ! ( $active ?? self::is_active() ) ) { return; } add_action( 'pmpro_after_change_membership_level', array( __CLASS__, 'log_level_change' ), 10, 3 ); add_action( 'pmpro_save_membership_level', array( __CLASS__, 'log_level_saved' ) ); add_action( 'pmpro_delete_membership_level', array( __CLASS__, 'log_level_deleted' ) ); } public static function post_types(): array { return array(); } public static function internal_post_types(): array { return array(); } /** * @param mixed $level_id The member's level now; 0 when cancelled. * @param mixed $user_id The member. * @param mixed $cancel_level The level cancelled, on a cancellation. */ public static function log_level_change( $level_id, $user_id, $cancel_level = null ): void { $level = People::id( $level_id ); $cancel = People::id( $cancel_level ); if ( $level > 0 ) { People::log( Memberships::CHANGED, 'User %1$s given membership level "%2$s"', People::id( $user_id ), self::level_name( $level ), array( 'plugin' => self::PLUGIN, 'level_id' => $level, ) ); return; } People::log( Memberships::CANCELLED, 'User %1$s cancelled membership level "%2$s"', People::id( $user_id ), $cancel > 0 ? self::level_name( $cancel ) : 'unknown', array( 'plugin' => self::PLUGIN, 'level_id' => $cancel, ) ); } /** * @param mixed $level_id The level saved. */ public static function log_level_saved( $level_id ): void { $level = People::id( $level_id ); $name = $level > 0 ? self::level_name( $level, '' ) : ''; if ( '' === $name ) { return; } self::level_row( Memberships::LEVEL_SAVED, $level, $name, 'saved' ); } /** * @param mixed $level_id The level about to be deleted. */ public static function log_level_deleted( $level_id ): void { $level = People::id( $level_id ); if ( $level <= 0 ) { return; } self::level_row( Memberships::LEVEL_DELETED, $level, self::level_name( $level ), 'deleted' ); } /** * @param string $type Event type. * @param int $level Level id. * @param string $name Its name. * @param string $verb What happened. */ private static function level_row( string $type, int $level, string $name, string $verb ): void { EventLogger::log( $type, sprintf( 'Membership level "%1$s" %2$s', $name, $verb ), 'membership_level', $level, array( 'plugin' => self::PLUGIN ) ); } /** * A level's name through Paid Memberships Pro's own API. * * @param int $level Level id. * @param string $fallback What to say when it cannot be read. */ private static function level_name( int $level, string $fallback = '#' ): string { if ( is_callable( self::$level_getter ) ) { $row = call_user_func( self::$level_getter, $level ); if ( is_object( $row ) && isset( $row->name ) && is_string( $row->name ) && '' !== $row->name ) { return EventLogger::bounded( wp_strip_all_tags( $row->name ), 200 ); } } return '#' === $fallback ? '#' . $level : $fallback; } }