Update inbox notes to display localized strings when locale changed (#34038)
* Add a filter woocommerce_get_note to modify note before it is returned * Make ChoosingTheme.get_note public so we can call it outside * Implement the get_note filter to return localized strings * Create get_actions method to reuse it in RemoteInboxNotificationsEngine * Implement get_note filter in RemoteInboxNotificationsEngine to return localized note * Add changelog * Make GivingFeedbackNotes.get_note public so we can call it outside * Check if note class has NOTE_NAME constant * Update WooSubscriptionsNotes to show localized content * Rename filter hook name * Remove todo to pass php lint * Update filter description * Move locale check into individual filter functions * Fix get_note_from_db logic * Fix php lint errors * Update the filter doc * Add test for spec-runner.php * Add tests for RemoteInboxNotificationsEngine * Remove unneeded check * Check if $note_from_class is instance of Note class * Fix unit test
This commit is contained in:
parent
71f722942d
commit
26a3d0d3c1
|
@ -0,0 +1,4 @@
|
|||
Significance: minor
|
||||
Type: update
|
||||
|
||||
Update inbox notes to display localized note when the locale is changed
|
|
@ -39,7 +39,14 @@ class Notes {
|
|||
$notes = array();
|
||||
foreach ( (array) $raw_notes as $raw_note ) {
|
||||
try {
|
||||
$note = new Note( $raw_note );
|
||||
$note = new Note( $raw_note );
|
||||
/**
|
||||
* Filter the note from db. This is used to modify the note before it is returned.
|
||||
*
|
||||
* @since 6.9.0
|
||||
* @param Note $note The note object from the database.
|
||||
*/
|
||||
$note = apply_filters( 'woocommerce_get_note_from_db', $note );
|
||||
$note_id = $note->get_id();
|
||||
$notes[ $note_id ] = $note->get_data();
|
||||
$notes[ $note_id ]['name'] = $note->get_name( $context );
|
||||
|
|
|
@ -9,6 +9,7 @@ defined( 'ABSPATH' ) || exit;
|
|||
|
||||
use \Automattic\WooCommerce\Admin\PluginsProvider\PluginsProvider;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Onboarding\OnboardingProfile;
|
||||
use \Automattic\WooCommerce\Admin\Notes\Note;
|
||||
|
||||
/**
|
||||
* Remote Inbox Notifications engine.
|
||||
|
@ -47,7 +48,7 @@ class RemoteInboxNotificationsEngine {
|
|||
array( __CLASS__, 'run_on_woocommerce_admin_updated' ),
|
||||
'woocommerce-remote-inbox-engine'
|
||||
);
|
||||
if ( null === $next_hook ) {
|
||||
if ( $next_hook === null ) {
|
||||
WC()->queue()->schedule_single(
|
||||
time(),
|
||||
'woocommerce_run_on_woocommerce_admin_updated',
|
||||
|
@ -57,6 +58,8 @@ class RemoteInboxNotificationsEngine {
|
|||
}
|
||||
}
|
||||
);
|
||||
|
||||
add_filter( 'woocommerce_get_note_from_db', array( __CLASS__, 'get_note_from_db' ), 10, 1 );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -108,7 +111,7 @@ class RemoteInboxNotificationsEngine {
|
|||
public static function run() {
|
||||
$specs = DataSourcePoller::get_instance()->get_specs_from_data_sources();
|
||||
|
||||
if ( false === $specs || 0 === count( $specs ) ) {
|
||||
if ( $specs === false || count( $specs ) === 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -141,7 +144,7 @@ class RemoteInboxNotificationsEngine {
|
|||
public static function get_stored_state() {
|
||||
$stored_state = get_option( self::STORED_STATE_OPTION_NAME );
|
||||
|
||||
if ( false === $stored_state ) {
|
||||
if ( $stored_state === false ) {
|
||||
$stored_state = new \stdClass();
|
||||
|
||||
$stored_state = StoredStateSetupForProducts::init_stored_state(
|
||||
|
@ -180,4 +183,33 @@ class RemoteInboxNotificationsEngine {
|
|||
public static function update_stored_state( $stored_state ) {
|
||||
update_option( self::STORED_STATE_OPTION_NAME, $stored_state, false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the note. This is used to display localized note.
|
||||
*
|
||||
* @param Note $note_from_db The note object created from db.
|
||||
* @return Note The note.
|
||||
*/
|
||||
public static function get_note_from_db( $note_from_db ) {
|
||||
if ( ! $note_from_db instanceof Note || get_user_locale() === $note_from_db->get_locale() ) {
|
||||
return $note_from_db;
|
||||
}
|
||||
$specs = DataSourcePoller::get_instance()->get_specs_from_data_sources();
|
||||
foreach ( $specs as $spec ) {
|
||||
if ( $spec->slug !== $note_from_db->get_name() ) {
|
||||
continue;
|
||||
}
|
||||
$locale = SpecRunner::get_locale( $spec->locales, true );
|
||||
if ( $locale === null ) {
|
||||
// No locale found, so don't update the note.
|
||||
break;
|
||||
}
|
||||
|
||||
$note_from_db->set_title( $locale->title );
|
||||
$note_from_db->set_content( $locale->content );
|
||||
$note_from_db->set_actions( SpecRunner::get_actions( $spec ) );
|
||||
}
|
||||
|
||||
return $note_from_db;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,12 +25,12 @@ class SpecRunner {
|
|||
|
||||
// Create or update the note.
|
||||
$existing_note_ids = $data_store->get_notes_with_name( $spec->slug );
|
||||
if ( 0 === count( $existing_note_ids ) ) {
|
||||
if ( count( $existing_note_ids ) === 0 ) {
|
||||
$note = new Note();
|
||||
$note->set_status( Note::E_WC_ADMIN_NOTE_PENDING );
|
||||
} else {
|
||||
$note = Notes::get_note( $existing_note_ids[0] );
|
||||
if ( false === $note ) {
|
||||
if ( $note === false ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ class SpecRunner {
|
|||
// Get the matching locale or fall back to en-US.
|
||||
$locale = self::get_locale( $spec->locales );
|
||||
|
||||
if ( null === $locale ) {
|
||||
if ( $locale === null ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -67,23 +67,8 @@ class SpecRunner {
|
|||
$note->set_source( $spec->source );
|
||||
}
|
||||
|
||||
// Clear then create actions.
|
||||
$note->clear_actions();
|
||||
$actions = isset( $spec->actions ) ? $spec->actions : array();
|
||||
foreach ( $actions as $action ) {
|
||||
$action_locale = self::get_action_locale( $action->locales );
|
||||
|
||||
$url = self::get_url( $action );
|
||||
|
||||
$note->add_action(
|
||||
$action->name,
|
||||
( null === $action_locale || ! isset( $action_locale->label ) )
|
||||
? ''
|
||||
: $action_locale->label,
|
||||
$url,
|
||||
$action->status
|
||||
);
|
||||
}
|
||||
// Recreate actions.
|
||||
$note->set_actions( self::get_actions( $spec ) );
|
||||
|
||||
$note->save();
|
||||
}
|
||||
|
@ -119,7 +104,7 @@ class SpecRunner {
|
|||
* @returns object The locale that was found, or null if no matching locale was found.
|
||||
*/
|
||||
public static function get_locale( $locales ) {
|
||||
$wp_locale = get_locale();
|
||||
$wp_locale = get_user_locale();
|
||||
$matching_wp_locales = array_values(
|
||||
array_filter(
|
||||
$locales,
|
||||
|
@ -129,7 +114,7 @@ class SpecRunner {
|
|||
)
|
||||
);
|
||||
|
||||
if ( 0 !== count( $matching_wp_locales ) ) {
|
||||
if ( count( $matching_wp_locales ) !== 0 ) {
|
||||
return $matching_wp_locales[0];
|
||||
}
|
||||
|
||||
|
@ -138,12 +123,12 @@ class SpecRunner {
|
|||
array_filter(
|
||||
$locales,
|
||||
function( $l ) {
|
||||
return 'en_US' === $l->locale;
|
||||
return $l->locale === 'en_US';
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
if ( 0 !== count( $en_us_locales ) ) {
|
||||
if ( count( $en_us_locales ) !== 0 ) {
|
||||
return $en_us_locales[0];
|
||||
}
|
||||
|
||||
|
@ -159,7 +144,7 @@ class SpecRunner {
|
|||
* @return object The matching locale, or the en_US fallback locale, or null if neither was found.
|
||||
*/
|
||||
public static function get_action_locale( $action_locales ) {
|
||||
$wp_locale = get_locale();
|
||||
$wp_locale = get_user_locale();
|
||||
$matching_wp_locales = array_values(
|
||||
array_filter(
|
||||
$action_locales,
|
||||
|
@ -169,7 +154,7 @@ class SpecRunner {
|
|||
)
|
||||
);
|
||||
|
||||
if ( 0 !== count( $matching_wp_locales ) ) {
|
||||
if ( count( $matching_wp_locales ) !== 0 ) {
|
||||
return $matching_wp_locales[0];
|
||||
}
|
||||
|
||||
|
@ -178,15 +163,42 @@ class SpecRunner {
|
|||
array_filter(
|
||||
$action_locales,
|
||||
function( $l ) {
|
||||
return 'en_US' === $l->locale;
|
||||
return $l->locale === 'en_US';
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
if ( 0 !== count( $en_us_locales ) ) {
|
||||
if ( count( $en_us_locales ) !== 0 ) {
|
||||
return $en_us_locales[0];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the actions for a note.
|
||||
*
|
||||
* @param object $spec The spec.
|
||||
*
|
||||
* @return array The actions.
|
||||
*/
|
||||
public static function get_actions( $spec ) {
|
||||
$note = new Note();
|
||||
$actions = isset( $spec->actions ) ? $spec->actions : array();
|
||||
foreach ( $actions as $action ) {
|
||||
$action_locale = self::get_action_locale( $action->locales );
|
||||
|
||||
$url = self::get_url( $action );
|
||||
|
||||
$note->add_action(
|
||||
$action->name,
|
||||
( $action_locale === null || ! isset( $action_locale->label ) )
|
||||
? ''
|
||||
: $action_locale->label,
|
||||
$url,
|
||||
$action->status
|
||||
);
|
||||
}
|
||||
return $note->get_actions();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,40 +8,49 @@ namespace Automattic\WooCommerce\Internal\Admin;
|
|||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
use \Automattic\WooCommerce\Admin\Features\Features;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\AddingAndManangingProducts;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\ChoosingTheme;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\CustomizingProductCatalog;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\FirstDownlaodableProduct;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\InsightFirstProductAndPayment;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\MobileApp;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\NewSalesRecord;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\TrackingOptIn;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\OnboardingPayments;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\PersonalizeStore;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\EUVATNumber;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\WooCommercePayments;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\MarketingJetpack;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\WooCommerceSubscriptions;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\MigrateFromShopify;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\LaunchChecklist;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\RealTimeOrderAlerts;
|
||||
use \Automattic\WooCommerce\Admin\RemoteInboxNotifications\DataSourcePoller;
|
||||
use \Automattic\WooCommerce\Admin\RemoteInboxNotifications\RemoteInboxNotificationsEngine;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\MerchantEmailNotifications;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\InsightFirstSale;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\OnlineClothingStore;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\FirstProduct;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\CustomizeStoreWithBlocks;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\TestCheckout;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\EditProductsOnTheMove;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\PerformanceOnMobile;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\ManageOrdersOnTheGo;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\AddFirstProduct;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Schedulers\MailchimpScheduler;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\AddingAndManangingProducts;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\ChoosingTheme;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\CompleteStoreDetails;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\UpdateStoreDetails;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\PaymentsRemindMeLater;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\CouponPageMoved;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\CustomizeStoreWithBlocks;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\CustomizingProductCatalog;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\EditProductsOnTheMove;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\EUVATNumber;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\FirstDownlaodableProduct;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\FirstProduct;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\InsightFirstProductAndPayment;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\InsightFirstSale;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\InstallJPAndWCSPlugins;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\LaunchChecklist;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\MagentoMigration;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\ManageOrdersOnTheGo;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\ManageStoreActivityFromHomeScreen;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\MarketingJetpack;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\MerchantEmailNotifications;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\MigrateFromShopify;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\MobileApp;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\NewSalesRecord;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\OnboardingPayments;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\OnlineClothingStore;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\OrderMilestones;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\PaymentsRemindMeLater;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\PerformanceOnMobile;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\PersonalizeStore;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\RealTimeOrderAlerts;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\SellingOnlineCourses;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\TestCheckout;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\TrackingOptIn;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\UnsecuredReportFiles;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\UpdateStoreDetails;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\WelcomeToWooCommerceForStoreUsers;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\WooCommercePayments;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\WooCommerceSubscriptions;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Notes\WooSubscriptionsNotes;
|
||||
use \Automattic\WooCommerce\Internal\Admin\Schedulers\MailchimpScheduler;
|
||||
use \Automattic\WooCommerce\Admin\Notes\Note;
|
||||
|
||||
/**
|
||||
* Events Class.
|
||||
|
@ -61,13 +70,68 @@ class Events {
|
|||
*/
|
||||
protected function __construct() {}
|
||||
|
||||
/**
|
||||
* Array of note class to be added or updated.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $note_classes_to_added_or_updated = array(
|
||||
AddFirstProduct::class,
|
||||
AddingAndManangingProducts::class,
|
||||
ChoosingTheme::class,
|
||||
CompleteStoreDetails::class,
|
||||
CustomizeStoreWithBlocks::class,
|
||||
CustomizingProductCatalog::class,
|
||||
EditProductsOnTheMove::class,
|
||||
EUVATNumber::class,
|
||||
FirstDownlaodableProduct::class,
|
||||
FirstProduct::class,
|
||||
InsightFirstProductAndPayment::class,
|
||||
InsightFirstSale::class,
|
||||
LaunchChecklist::class,
|
||||
MagentoMigration::class,
|
||||
ManageOrdersOnTheGo::class,
|
||||
MarketingJetpack::class,
|
||||
MigrateFromShopify::class,
|
||||
MobileApp::class,
|
||||
NewSalesRecord::class,
|
||||
OnboardingPayments::class,
|
||||
OnlineClothingStore::class,
|
||||
PaymentsRemindMeLater::class,
|
||||
PerformanceOnMobile::class,
|
||||
PersonalizeStore::class,
|
||||
RealTimeOrderAlerts::class,
|
||||
TestCheckout::class,
|
||||
TrackingOptIn::class,
|
||||
UpdateStoreDetails::class,
|
||||
WooCommercePayments::class,
|
||||
WooCommerceSubscriptions::class,
|
||||
);
|
||||
|
||||
/**
|
||||
* The other note classes that are added in other places.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $other_note_classes = array(
|
||||
CouponPageMoved::class,
|
||||
InstallJPAndWCSPlugins::class,
|
||||
ManageStoreActivityFromHomeScreen::class,
|
||||
OrderMilestones::class,
|
||||
SellingOnlineCourses::class,
|
||||
UnsecuredReportFiles::class,
|
||||
WelcomeToWooCommerceForStoreUsers::class,
|
||||
WooSubscriptionsNotes::class,
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* Get class instance.
|
||||
*
|
||||
* @return object Instance.
|
||||
*/
|
||||
final public static function instance() {
|
||||
if ( null === static::$instance ) {
|
||||
if ( static::$instance === null ) {
|
||||
static::$instance = new static();
|
||||
}
|
||||
return static::$instance;
|
||||
|
@ -78,6 +142,7 @@ class Events {
|
|||
*/
|
||||
public function init() {
|
||||
add_action( 'wc_admin_daily', array( $this, 'do_wc_admin_daily' ) );
|
||||
add_filter( 'woocommerce_get_note_from_db', array( $this, 'get_note_from_db' ), 10, 1 );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -104,40 +169,43 @@ class Events {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get note.
|
||||
*
|
||||
* @param Note $note_from_db The note object from the database.
|
||||
*/
|
||||
public function get_note_from_db( $note_from_db ) {
|
||||
if ( ! $note_from_db instanceof Note || get_user_locale() === $note_from_db->get_locale() ) {
|
||||
return $note_from_db;
|
||||
}
|
||||
|
||||
$note_classes = array_merge( self::$note_classes_to_added_or_updated, self::$other_note_classes );
|
||||
foreach ( $note_classes as $note_class ) {
|
||||
if ( defined( "$note_class::NOTE_NAME" ) && $note_class::NOTE_NAME === $note_from_db->get_name() ) {
|
||||
$note_from_class = method_exists( $note_class, 'get_note' ) ? $note_class::get_note() : null;
|
||||
|
||||
if ( $note_from_class instanceof Note ) {
|
||||
$note = clone $note_from_db;
|
||||
$note->set_title( $note_from_class->get_title() );
|
||||
$note->set_content( $note_from_class->get_content() );
|
||||
$note->set_actions( $note_from_class->get_actions() );
|
||||
return $note;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $note_from_db;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds notes that should be added.
|
||||
*/
|
||||
protected function possibly_add_notes() {
|
||||
NewSalesRecord::possibly_add_note();
|
||||
MobileApp::possibly_add_note();
|
||||
TrackingOptIn::possibly_add_note();
|
||||
OnboardingPayments::possibly_add_note();
|
||||
PersonalizeStore::possibly_add_note();
|
||||
WooCommercePayments::possibly_add_note();
|
||||
EUVATNumber::possibly_add_note();
|
||||
MarketingJetpack::possibly_add_note();
|
||||
WooCommerceSubscriptions::possibly_add_note();
|
||||
MigrateFromShopify::possibly_add_note();
|
||||
InsightFirstSale::possibly_add_note();
|
||||
LaunchChecklist::possibly_add_note();
|
||||
OnlineClothingStore::possibly_add_note();
|
||||
FirstProduct::possibly_add_note();
|
||||
RealTimeOrderAlerts::possibly_add_note();
|
||||
CustomizeStoreWithBlocks::possibly_add_note();
|
||||
TestCheckout::possibly_add_note();
|
||||
EditProductsOnTheMove::possibly_add_note();
|
||||
PerformanceOnMobile::possibly_add_note();
|
||||
ManageOrdersOnTheGo::possibly_add_note();
|
||||
ChoosingTheme::possibly_add_note();
|
||||
InsightFirstProductAndPayment::possibly_add_note();
|
||||
AddFirstProduct::possibly_add_note();
|
||||
AddingAndManangingProducts::possibly_add_note();
|
||||
CustomizingProductCatalog::possibly_add_note();
|
||||
FirstDownlaodableProduct::possibly_add_note();
|
||||
CompleteStoreDetails::possibly_add_note();
|
||||
UpdateStoreDetails::possibly_add_note();
|
||||
PaymentsRemindMeLater::possibly_add_note();
|
||||
MagentoMigration::possibly_add_note();
|
||||
foreach ( self::$note_classes_to_added_or_updated as $note_class ) {
|
||||
if ( method_exists( $note_class, 'possibly_add_note' ) ) {
|
||||
$note_class::possibly_add_note();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -151,36 +219,11 @@ class Events {
|
|||
* Updates notes that should be updated.
|
||||
*/
|
||||
protected function possibly_update_notes() {
|
||||
NewSalesRecord::possibly_update_note();
|
||||
MobileApp::possibly_update_note();
|
||||
TrackingOptIn::possibly_update_note();
|
||||
OnboardingPayments::possibly_update_note();
|
||||
PersonalizeStore::possibly_update_note();
|
||||
WooCommercePayments::possibly_update_note();
|
||||
EUVATNumber::possibly_update_note();
|
||||
MarketingJetpack::possibly_update_note();
|
||||
WooCommerceSubscriptions::possibly_update_note();
|
||||
MigrateFromShopify::possibly_update_note();
|
||||
InsightFirstSale::possibly_update_note();
|
||||
LaunchChecklist::possibly_update_note();
|
||||
OnlineClothingStore::possibly_update_note();
|
||||
FirstProduct::possibly_update_note();
|
||||
RealTimeOrderAlerts::possibly_update_note();
|
||||
CustomizeStoreWithBlocks::possibly_update_note();
|
||||
TestCheckout::possibly_update_note();
|
||||
EditProductsOnTheMove::possibly_update_note();
|
||||
PerformanceOnMobile::possibly_update_note();
|
||||
ManageOrdersOnTheGo::possibly_update_note();
|
||||
ChoosingTheme::possibly_update_note();
|
||||
InsightFirstProductAndPayment::possibly_update_note();
|
||||
AddFirstProduct::possibly_update_note();
|
||||
AddingAndManangingProducts::possibly_update_note();
|
||||
CustomizingProductCatalog::possibly_update_note();
|
||||
FirstDownlaodableProduct::possibly_update_note();
|
||||
CompleteStoreDetails::possibly_update_note();
|
||||
UpdateStoreDetails::possibly_update_note();
|
||||
PaymentsRemindMeLater::possibly_update_note();
|
||||
MagentoMigration::possibly_update_note();
|
||||
foreach ( self::$note_classes_to_added_or_updated as $note_class ) {
|
||||
if ( method_exists( $note_class, 'possibly_update_note' ) ) {
|
||||
$note_class::possibly_update_note();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -195,7 +238,7 @@ class Events {
|
|||
}
|
||||
|
||||
// Check if the site has opted out of marketplace suggestions.
|
||||
if ( 'yes' !== get_option( 'woocommerce_show_marketplace_suggestions', 'yes' ) ) {
|
||||
if ( get_option( 'woocommerce_show_marketplace_suggestions', 'yes' ) !== 'yes' ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -210,7 +253,7 @@ class Events {
|
|||
*/
|
||||
protected function is_merchant_email_notifications_enabled() {
|
||||
// Check if the feature flag is disabled.
|
||||
if ( 'yes' !== get_option( 'woocommerce_merchant_email_notifications', 'no' ) ) {
|
||||
if ( get_option( 'woocommerce_merchant_email_notifications', 'no' ) !== 'yes' ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ class ChoosingTheme {
|
|||
*
|
||||
* @return Note
|
||||
*/
|
||||
protected static function get_note() {
|
||||
public static function get_note() {
|
||||
// We need to show choosing a theme notification after 1 day of install.
|
||||
if ( ! self::is_wc_admin_active_in_date_range( 'week-1', DAY_IN_SECONDS ) ) {
|
||||
return;
|
||||
|
|
|
@ -32,7 +32,7 @@ class GivingFeedbackNotes {
|
|||
*
|
||||
* @return Note
|
||||
*/
|
||||
protected static function get_note() {
|
||||
public static function get_note() {
|
||||
if ( ! self::is_wc_admin_active_in_date_range( 'week-1-4' ) ) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ use \Automattic\WooCommerce\Admin\Notes\Notes;
|
|||
*/
|
||||
class WooSubscriptionsNotes {
|
||||
const LAST_REFRESH_OPTION_KEY = 'woocommerce_admin-wc-helper-last-refresh';
|
||||
const NOTE_NAME = 'wc-admin-wc-helper-connection';
|
||||
const CONNECTION_NOTE_NAME = 'wc-admin-wc-helper-connection';
|
||||
const SUBSCRIPTION_NOTE_NAME = 'wc-admin-wc-helper-subscription';
|
||||
const NOTIFY_WHEN_DAYS_LEFT = 60;
|
||||
|
@ -181,6 +182,14 @@ class WooSubscriptionsNotes {
|
|||
* Adds a note prompting to connect to WooCommerce.com.
|
||||
*/
|
||||
public function add_no_connection_note() {
|
||||
$note = self::get_note();
|
||||
$note->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the WooCommerce.com connection note
|
||||
*/
|
||||
public static function get_note() {
|
||||
$note = new Note();
|
||||
$note->set_title( __( 'Connect to WooCommerce.com', 'woocommerce' ) );
|
||||
$note->set_content( __( 'Connect to get important product notifications and updates.', 'woocommerce' ) );
|
||||
|
@ -194,7 +203,7 @@ class WooSubscriptionsNotes {
|
|||
'?page=wc-addons§ion=helper',
|
||||
Note::E_WC_ADMIN_NOTE_UNACTIONED
|
||||
);
|
||||
$note->save();
|
||||
return $note;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,113 @@
|
|||
<?php
|
||||
/**
|
||||
* RemoteInboxNotificationsEngine tests.
|
||||
*
|
||||
* @package WooCommerce\Admin\Tests\RemoteInboxNotifications
|
||||
*/
|
||||
|
||||
use Automattic\WooCommerce\Admin\RemoteInboxNotifications\RemoteInboxNotificationsEngine;
|
||||
use Automattic\WooCommerce\Admin\RemoteInboxNotifications\DataSourcePoller;
|
||||
use \Automattic\WooCommerce\Admin\Notes\Note;
|
||||
|
||||
/**
|
||||
* class WC_Admin_Tests_RemoteInboxNotifications_SpecRunner
|
||||
*/
|
||||
class WC_Admin_Tests_RemoteInboxNotifications_RemoteInboxNotificationsEngine extends WC_Unit_Test_Case {
|
||||
|
||||
/**
|
||||
* Set up.
|
||||
*/
|
||||
public function setUp(): void {
|
||||
parent::setUp();
|
||||
|
||||
add_filter(
|
||||
'transient_woocommerce_admin_' . DataSourcePoller::ID . '_specs',
|
||||
function( $value ) {
|
||||
if ( $value ) {
|
||||
return $value;
|
||||
}
|
||||
$specs = array(
|
||||
'zh_TW' => json_decode(
|
||||
'[{
|
||||
"slug": "test",
|
||||
"status": "unactioned",
|
||||
"type": "info",
|
||||
"locales": [{
|
||||
"locale": "zh_TW",
|
||||
"title": "名稱",
|
||||
"content": "內容"
|
||||
}],
|
||||
"rules": [],
|
||||
"actions": [ {
|
||||
"name": "test-action",
|
||||
"locales": [
|
||||
{
|
||||
"locale": "zh_TW",
|
||||
"label": "標籤"
|
||||
}],
|
||||
"url": "test",
|
||||
"url_is_admin_query": false,
|
||||
"status": "unactioned"
|
||||
}]
|
||||
}]'
|
||||
),
|
||||
);
|
||||
|
||||
return $specs;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tear down.
|
||||
*/
|
||||
public function tearDown(): void {
|
||||
parent::tearDown();
|
||||
delete_transient( 'woocommerce_admin_' . DataSourcePoller::ID . '_specs' );
|
||||
remove_all_filters( 'transient_woocommerce_admin_' . DataSourcePoller::ID . '_specs' );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tests get_note_from_db function with a invalid note.
|
||||
*
|
||||
*/
|
||||
public function test_get_note_from_db_with_invalid_note() {
|
||||
$invalid_note = array(
|
||||
'note_name' => 'invalid',
|
||||
);
|
||||
$this->assertEquals( RemoteInboxNotificationsEngine::get_note_from_db( $invalid_note ), $invalid_note );
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests get_note_from_db function when locale is the same
|
||||
*
|
||||
*/
|
||||
public function test_get_note_from_db_when_the_locale_is_the_same() {
|
||||
$note = new Note();
|
||||
$note->set_locale( get_user_locale() );
|
||||
$this->assertEquals( RemoteInboxNotificationsEngine::get_note_from_db( $note ), $note );
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests get_note_from_db function when locales are different
|
||||
*
|
||||
*/
|
||||
public function test_get_note_from_db_when_locales_are_different() {
|
||||
$note_from_db = new Note();
|
||||
$note_from_db->set_locale( 'en_US' );
|
||||
$note_from_db->set_name( 'test' );
|
||||
|
||||
add_filter(
|
||||
'locale',
|
||||
function( $locale ) {
|
||||
return 'zh_TW';
|
||||
}
|
||||
);
|
||||
|
||||
$note = RemoteInboxNotificationsEngine::get_note_from_db( $note_from_db );
|
||||
$this->assertEquals( $note->get_title(), '名稱' );
|
||||
$this->assertEquals( $note->get_content(), '內容' );
|
||||
$this->assertEquals( $note->get_actions()[0]->label, '標籤' );
|
||||
}
|
||||
}
|
|
@ -87,4 +87,33 @@ class WC_Admin_Tests_RemoteInboxNotifications_SpecRunner extends WC_Unit_Test_Ca
|
|||
$action = $note->get_action( 'test-action' );
|
||||
$this->assertEquals( 'http://test.com', $action->query );
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests get actions function.
|
||||
*
|
||||
* @group fast
|
||||
*/
|
||||
public function test_get_actions() {
|
||||
$spec = $this->get_spec( 'http://test.com', false );
|
||||
$actions = SpecRunner::get_actions( $spec );
|
||||
$this->assertCount( 1, $actions );
|
||||
$this->assertEquals( $actions[0]->name, 'test-action' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests get actions function with no actions in specs.
|
||||
*
|
||||
* @group fast
|
||||
*/
|
||||
public function test_get_actions_with_empty_specs() {
|
||||
$actions = SpecRunner::get_actions( array() );
|
||||
$this->assertCount( 0, $actions );
|
||||
|
||||
$actions = SpecRunner::get_actions(
|
||||
array(
|
||||
'actions' => array(),
|
||||
)
|
||||
);
|
||||
$this->assertCount( 0, $actions );
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue