File: /var/www/vhosts/uyarreklam.com.tr/httpdocs/Services.tar
CreateAccount.php 0000644 00000004551 15155647076 0010022 0 ustar 00 <?php
namespace Automattic\WooCommerce\Blocks\Domain\Services;
use Automattic\WooCommerce\Blocks\Domain\Package;
use Automattic\WooCommerce\Blocks\Domain\Services\Email\CustomerNewAccount;
/**
* Service class implementing new create account emails used for order processing via the Block Based Checkout.
*/
class CreateAccount {
/**
* Reference to the Package instance
*
* @var Package
*/
private $package;
/**
* Constructor.
*
* @param Package $package An instance of (Woo Blocks) Package.
*/
public function __construct( Package $package ) {
$this->package = $package;
}
/**
* Init - register handlers for WooCommerce core email hooks.
*/
public function init() {
// Override core email handlers to add our new improved "new account" email.
add_action(
'woocommerce_email',
function ( $wc_emails_instance ) {
// Remove core "new account" handler; we are going to replace it.
remove_action( 'woocommerce_created_customer_notification', array( $wc_emails_instance, 'customer_new_account' ), 10, 3 );
// Add custom "new account" handler.
add_action(
'woocommerce_created_customer_notification',
function( $customer_id, $new_customer_data = array(), $password_generated = false ) use ( $wc_emails_instance ) {
// If this is a block-based signup, send a new email with password reset link (no password in email).
if ( isset( $new_customer_data['source'] ) && 'store-api' === $new_customer_data['source'] ) {
$this->customer_new_account( $customer_id, $new_customer_data );
return;
}
// Otherwise, trigger the existing legacy email (with new password inline).
$wc_emails_instance->customer_new_account( $customer_id, $new_customer_data, $password_generated );
},
10,
3
);
}
);
}
/**
* Trigger new account email.
* This is intended as a replacement to WC_Emails::customer_new_account(),
* with a set password link instead of emailing the new password in email
* content.
*
* @param int $customer_id The ID of the new customer account.
* @param array $new_customer_data Assoc array of data for the new account.
*/
public function customer_new_account( $customer_id = 0, array $new_customer_data = array() ) {
$new_account_email = new CustomerNewAccount( $this->package );
$new_account_email->trigger( $customer_id, $new_customer_data );
}
}
DraftOrders.php 0000644 00000016437 15155647076 0007527 0 ustar 00 <?php
namespace Automattic\WooCommerce\Blocks\Domain\Services;
use Automattic\WooCommerce\Blocks\Domain\Package;
use Exception;
use WC_Order;
/**
* Service class for adding DraftOrder functionality to WooCommerce core.
*
* Sets up all logic related to the Checkout Draft Orders service
*
* @internal
*/
class DraftOrders {
const DB_STATUS = 'wc-checkout-draft';
const STATUS = 'checkout-draft';
/**
* Holds the Package instance
*
* @var Package
*/
private $package;
/**
* Constructor
*
* @param Package $package An instance of the package class.
*/
public function __construct( Package $package ) {
$this->package = $package;
}
/**
* Set all hooks related to adding Checkout Draft order functionality to Woo Core.
*/
public function init() {
add_filter( 'wc_order_statuses', [ $this, 'register_draft_order_status' ] );
add_filter( 'woocommerce_register_shop_order_post_statuses', [ $this, 'register_draft_order_post_status' ] );
add_filter( 'woocommerce_analytics_excluded_order_statuses', [ $this, 'append_draft_order_post_status' ] );
add_filter( 'woocommerce_valid_order_statuses_for_payment', [ $this, 'append_draft_order_post_status' ] );
add_filter( 'woocommerce_valid_order_statuses_for_payment_complete', [ $this, 'append_draft_order_post_status' ] );
// Hook into the query to retrieve My Account orders so draft status is excluded.
add_action( 'woocommerce_my_account_my_orders_query', [ $this, 'delete_draft_order_post_status_from_args' ] );
add_action( 'woocommerce_cleanup_draft_orders', [ $this, 'delete_expired_draft_orders' ] );
add_action( 'admin_init', [ $this, 'install' ] );
}
/**
* Installation related logic for Draft order functionality.
*
* @internal
*/
public function install() {
$this->maybe_create_cronjobs();
}
/**
* Maybe create cron events.
*/
protected function maybe_create_cronjobs() {
if ( function_exists( 'as_next_scheduled_action' ) && false === as_next_scheduled_action( 'woocommerce_cleanup_draft_orders' ) ) {
as_schedule_recurring_action( strtotime( 'midnight tonight' ), DAY_IN_SECONDS, 'woocommerce_cleanup_draft_orders' );
}
}
/**
* Register custom order status for orders created via the API during checkout.
*
* Draft order status is used before payment is attempted, during checkout, when a cart is converted to an order.
*
* @param array $statuses Array of statuses.
* @internal
* @return array
*/
public function register_draft_order_status( array $statuses ) {
$statuses[ self::DB_STATUS ] = _x( 'Draft', 'Order status', 'woocommerce' );
return $statuses;
}
/**
* Register custom order post status for orders created via the API during checkout.
*
* @param array $statuses Array of statuses.
* @internal
* @return array
*/
public function register_draft_order_post_status( array $statuses ) {
$statuses[ self::DB_STATUS ] = $this->get_post_status_properties();
return $statuses;
}
/**
* Returns the properties of this post status for registration.
*
* @return array
*/
private function get_post_status_properties() {
return [
'label' => _x( 'Draft', 'Order status', 'woocommerce' ),
'public' => false,
'exclude_from_search' => false,
'show_in_admin_all_list' => false,
'show_in_admin_status_list' => true,
/* translators: %s: number of orders */
'label_count' => _n_noop( 'Drafts <span class="count">(%s)</span>', 'Drafts <span class="count">(%s)</span>', 'woocommerce' ),
];
}
/**
* Remove draft status from the 'status' argument of an $args array.
*
* @param array $args Array of arguments containing statuses in the status key.
* @internal
* @return array
*/
public function delete_draft_order_post_status_from_args( $args ) {
if ( ! array_key_exists( 'status', $args ) ) {
$statuses = [];
foreach ( wc_get_order_statuses() as $key => $label ) {
if ( self::DB_STATUS !== $key ) {
$statuses[] = str_replace( 'wc-', '', $key );
}
}
$args['status'] = $statuses;
} elseif ( self::DB_STATUS === $args['status'] ) {
$args['status'] = '';
} elseif ( is_array( $args['status'] ) ) {
$args['status'] = array_diff_key( $args['status'], array( self::STATUS => null ) );
}
return $args;
}
/**
* Append draft status to a list of statuses.
*
* @param array $statuses Array of statuses.
* @internal
* @return array
*/
public function append_draft_order_post_status( $statuses ) {
$statuses[] = self::STATUS;
return $statuses;
}
/**
* Delete draft orders older than a day in batches of 20.
*
* Ran on a daily cron schedule.
*
* @internal
*/
public function delete_expired_draft_orders() {
$count = 0;
$batch_size = 20;
$this->ensure_draft_status_registered();
$orders = wc_get_orders(
[
'date_modified' => '<=' . strtotime( '-1 DAY' ),
'limit' => $batch_size,
'status' => self::DB_STATUS,
'type' => 'shop_order',
]
);
// do we bail because the query results are unexpected?
try {
$this->assert_order_results( $orders, $batch_size );
if ( $orders ) {
foreach ( $orders as $order ) {
$order->delete( true );
$count ++;
}
}
if ( $batch_size === $count && function_exists( 'as_enqueue_async_action' ) ) {
as_enqueue_async_action( 'woocommerce_cleanup_draft_orders' );
}
} catch ( Exception $error ) {
wc_caught_exception( $error, __METHOD__ );
}
}
/**
* Since it's possible for third party code to clobber the `$wp_post_statuses` global,
* we need to do a final check here to make sure the draft post status is
* registered with the global so that it is not removed by WP_Query status
* validation checks.
*/
private function ensure_draft_status_registered() {
$is_registered = get_post_stati( [ 'name' => self::DB_STATUS ] );
if ( empty( $is_registered ) ) {
register_post_status(
self::DB_STATUS,
$this->get_post_status_properties()
);
}
}
/**
* Asserts whether incoming order results are expected given the query
* this service class executes.
*
* @param WC_Order[] $order_results The order results being asserted.
* @param int $expected_batch_size The expected batch size for the results.
* @throws Exception If any assertions fail, an exception is thrown.
*/
private function assert_order_results( $order_results, $expected_batch_size ) {
// if not an array, then just return because it won't get handled
// anyways.
if ( ! is_array( $order_results ) ) {
return;
}
$suffix = ' This is an indicator that something is filtering WooCommerce or WordPress queries and modifying the query parameters.';
// if count is greater than our expected batch size, then that's a problem.
if ( count( $order_results ) > 20 ) {
throw new Exception( 'There are an unexpected number of results returned from the query.' . $suffix );
}
// if any of the returned orders are not draft (or not a WC_Order), then that's a problem.
foreach ( $order_results as $order ) {
if ( ! ( $order instanceof WC_Order ) ) {
throw new Exception( 'The returned results contain a value that is not a WC_Order.' . $suffix );
}
if ( ! $order->has_status( self::STATUS ) ) {
throw new Exception( 'The results contain an order that is not a `wc-checkout-draft` status in the results.' . $suffix );
}
}
}
}
Email/CustomerNewAccount.php 0000644 00000011042 15155647076 0012112 0 ustar 00 <?php
namespace Automattic\WooCommerce\Blocks\Domain\Services\Email;
use Automattic\WooCommerce\Blocks\Domain\Package;
/**
* Customer New Account.
*
* An email sent to the customer when they create an account.
* This is intended as a replacement to \WC_Email_Customer_New_Account(),
* with a set password link instead of emailing the new password in email
* content.
*
* @extends \WC_Email
*/
class CustomerNewAccount extends \WC_Email {
/**
* User login name.
*
* @var string
*/
public $user_login;
/**
* User email.
*
* @var string
*/
public $user_email;
/**
* Magic link to set initial password.
*
* @var string
*/
public $set_password_url;
/**
* Override (force) default template path
*
* @var string
*/
public $default_template_path;
/**
* Constructor.
*
* @param Package $package An instance of (Woo Blocks) Package.
*/
public function __construct( Package $package ) {
// Note - we're using the same ID as the real email.
// This ensures that any merchant tweaks (Settings > Emails)
// apply to this email (consistent with the core email).
$this->id = 'customer_new_account';
$this->customer_email = true;
$this->title = __( 'New account', 'woocommerce' );
$this->description = __( '“New Account” emails are sent when a customer signs up via the checkout flow.', 'woocommerce' );
$this->template_html = 'emails/customer-new-account-blocks.php';
$this->template_plain = 'emails/plain/customer-new-account-blocks.php';
$this->default_template_path = $package->get_path( '/templates/' );
// Call parent constructor.
parent::__construct();
}
/**
* Get email subject.
*
* @since 3.1.0
* @return string
*/
public function get_default_subject() {
return __( 'Your {site_title} account has been created!', 'woocommerce' );
}
/**
* Get email heading.
*
* @since 3.1.0
* @return string
*/
public function get_default_heading() {
return __( 'Welcome to {site_title}', 'woocommerce' );
}
/**
* Trigger.
*
* @param int $user_id User ID.
* @param string $user_pass User password.
* @param bool $password_generated Whether the password was generated automatically or not.
*/
public function trigger( $user_id, $user_pass = '', $password_generated = false ) {
$this->setup_locale();
if ( $user_id ) {
$this->object = new \WP_User( $user_id );
// Generate a magic link so user can set initial password.
$key = get_password_reset_key( $this->object );
if ( ! is_wp_error( $key ) ) {
$action = 'newaccount';
$this->set_password_url = wc_get_account_endpoint_url( 'lost-password' ) . "?action=$action&key=$key&login=" . rawurlencode( $this->object->user_login );
}
$this->user_login = stripslashes( $this->object->user_login );
$this->user_email = stripslashes( $this->object->user_email );
$this->recipient = $this->user_email;
}
if ( $this->is_enabled() && $this->get_recipient() ) {
$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments(), $this->set_password_url );
}
$this->restore_locale();
}
/**
* Get content html.
*
* @return string
*/
public function get_content_html() {
return wc_get_template_html(
$this->template_html,
array(
'email_heading' => $this->get_heading(),
'additional_content' => $this->get_additional_content(),
'user_login' => $this->user_login,
'blogname' => $this->get_blogname(),
'set_password_url' => $this->set_password_url,
'sent_to_admin' => false,
'plain_text' => false,
'email' => $this,
),
'',
$this->default_template_path
);
}
/**
* Get content plain.
*
* @return string
*/
public function get_content_plain() {
return wc_get_template_html(
$this->template_plain,
array(
'email_heading' => $this->get_heading(),
'additional_content' => $this->get_additional_content(),
'user_login' => $this->user_login,
'blogname' => $this->get_blogname(),
'set_password_url' => $this->set_password_url,
'sent_to_admin' => false,
'plain_text' => true,
'email' => $this,
),
'',
$this->default_template_path
);
}
/**
* Default content to show below main email content.
*
* @since 3.7.0
* @return string
*/
public function get_default_additional_content() {
return __( 'We look forward to seeing you soon.', 'woocommerce' );
}
}
FeatureGating.php 0000644 00000007702 15155647076 0010030 0 ustar 00 <?php
namespace Automattic\WooCommerce\Blocks\Domain\Services;
/**
* Service class that handles the feature flags.
*
* @internal
*/
class FeatureGating {
/**
* Current flag value.
*
* @var int
*/
private $flag;
const EXPERIMENTAL_FLAG = 3;
const FEATURE_PLUGIN_FLAG = 2;
const CORE_FLAG = 1;
/**
* Current environment
*
* @var string
*/
private $environment;
const PRODUCTION_ENVIRONMENT = 'production';
const DEVELOPMENT_ENVIRONMENT = 'development';
const TEST_ENVIRONMENT = 'test';
/**
* Constructor
*
* @param int $flag Hardcoded flag value. Useful for tests.
* @param string $environment Hardcoded environment value. Useful for tests.
*/
public function __construct( $flag = 0, $environment = 'unset' ) {
$this->flag = $flag;
$this->environment = $environment;
$this->load_flag();
$this->load_environment();
}
/**
* Set correct flag.
*/
public function load_flag() {
if ( 0 === $this->flag ) {
$default_flag = defined( 'WC_BLOCKS_IS_FEATURE_PLUGIN' ) ? self::FEATURE_PLUGIN_FLAG : self::CORE_FLAG;
if ( file_exists( __DIR__ . '/../../../blocks.ini' ) ) {
$allowed_flags = [ self::EXPERIMENTAL_FLAG, self::FEATURE_PLUGIN_FLAG, self::CORE_FLAG ];
$woo_options = parse_ini_file( __DIR__ . '/../../../blocks.ini' );
$this->flag = is_array( $woo_options ) && in_array( intval( $woo_options['woocommerce_blocks_phase'] ), $allowed_flags, true ) ? $woo_options['woocommerce_blocks_phase'] : $default_flag;
} else {
$this->flag = $default_flag;
}
}
}
/**
* Set correct environment.
*/
public function load_environment() {
if ( 'unset' === $this->environment ) {
if ( file_exists( __DIR__ . '/../../../blocks.ini' ) ) {
$allowed_environments = [ self::PRODUCTION_ENVIRONMENT, self::DEVELOPMENT_ENVIRONMENT, self::TEST_ENVIRONMENT ];
$woo_options = parse_ini_file( __DIR__ . '/../../../blocks.ini' );
$this->environment = is_array( $woo_options ) && in_array( $woo_options['woocommerce_blocks_env'], $allowed_environments, true ) ? $woo_options['woocommerce_blocks_env'] : self::PRODUCTION_ENVIRONMENT;
} else {
$this->environment = self::PRODUCTION_ENVIRONMENT;
}
}
}
/**
* Returns the current flag value.
*
* @return int
*/
public function get_flag() {
return $this->flag;
}
/**
* Checks if we're executing the code in an experimental build mode.
*
* @return boolean
*/
public function is_experimental_build() {
return $this->flag >= self::EXPERIMENTAL_FLAG;
}
/**
* Checks if we're executing the code in an feature plugin or experimental build mode.
*
* @return boolean
*/
public function is_feature_plugin_build() {
return $this->flag >= self::FEATURE_PLUGIN_FLAG;
}
/**
* Returns the current environment value.
*
* @return string
*/
public function get_environment() {
return $this->environment;
}
/**
* Checks if we're executing the code in an development environment.
*
* @return boolean
*/
public function is_development_environment() {
return self::DEVELOPMENT_ENVIRONMENT === $this->environment;
}
/**
* Checks if we're executing the code in a production environment.
*
* @return boolean
*/
public function is_production_environment() {
return self::PRODUCTION_ENVIRONMENT === $this->environment;
}
/**
* Checks if we're executing the code in a test environment.
*
* @return boolean
*/
public function is_test_environment() {
return self::TEST_ENVIRONMENT === $this->environment;
}
/**
* Returns core flag value.
*
* @return number
*/
public static function get_core_flag() {
return self::CORE_FLAG;
}
/**
* Returns feature plugin flag value.
*
* @return number
*/
public static function get_feature_plugin_flag() {
return self::FEATURE_PLUGIN_FLAG;
}
/**
* Returns experimental flag value.
*
* @return number
*/
public static function get_experimental_flag() {
return self::EXPERIMENTAL_FLAG;
}
}
GoogleAnalytics.php 0000644 00000006451 15155647076 0010367 0 ustar 00 <?php
namespace Automattic\WooCommerce\Blocks\Domain\Services;
use Automattic\WooCommerce\Blocks\Package;
use Automattic\WooCommerce\Blocks\Assets\Api as AssetApi;
/**
* Service class to integrate Blocks with the Google Analytics extension,
*/
class GoogleAnalytics {
/**
* Instance of the asset API.
*
* @var AssetApi
*/
protected $asset_api;
/**
* Constructor.
*
* @param AssetApi $asset_api Instance of the asset API.
*/
public function __construct( AssetApi $asset_api ) {
$this->asset_api = $asset_api;
}
/**
* Hook into WP.
*/
public function init() {
// Require Google Analytics Integration to be activated.
if ( ! class_exists( 'WC_Google_Analytics_Integration', false ) ) {
return;
}
add_action( 'init', array( $this, 'register_assets' ) );
add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
add_filter( 'script_loader_tag', array( $this, 'async_script_loader_tags' ), 10, 3 );
}
/**
* Register scripts.
*/
public function register_assets() {
$this->asset_api->register_script( 'wc-blocks-google-analytics', 'build/wc-blocks-google-analytics.js', [ 'google-tag-manager' ] );
}
/**
* Enqueue the Google Tag Manager script if prerequisites are met.
*/
public function enqueue_scripts() {
$settings = $this->get_google_analytics_settings();
$prefix = strstr( strtoupper( $settings['ga_id'] ), '-', true );
// Require tracking to be enabled with a valid GA ID.
if ( ! in_array( $prefix, [ 'G', 'GT' ], true ) ) {
return;
}
/**
* Filter to disable Google Analytics tracking.
*
* @internal Matches filter name in GA extension.
* @since 4.9.0
*
* @param boolean $disable_tracking If true, tracking will be disabled.
*/
if ( apply_filters( 'woocommerce_ga_disable_tracking', ! wc_string_to_bool( $settings['ga_event_tracking_enabled'] ) ) ) {
return;
}
if ( ! wp_script_is( 'google-tag-manager', 'registered' ) ) {
// phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion
wp_register_script( 'google-tag-manager', 'https://www.googletagmanager.com/gtag/js?id=' . $settings['ga_id'], [], null, false );
wp_add_inline_script(
'google-tag-manager',
"
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '" . esc_js( $settings['ga_id'] ) . "', { 'send_page_view': false });"
);
}
wp_enqueue_script( 'wc-blocks-google-analytics' );
}
/**
* Get settings from the GA integration extension.
*
* @return array
*/
private function get_google_analytics_settings() {
return wp_parse_args(
get_option( 'woocommerce_google_analytics_settings' ),
[
'ga_id' => '',
'ga_event_tracking_enabled' => 'no',
]
);
}
/**
* Add async to script tags with defined handles.
*
* @param string $tag HTML for the script tag.
* @param string $handle Handle of script.
* @param string $src Src of script.
* @return string
*/
public function async_script_loader_tags( $tag, $handle, $src ) {
if ( ! in_array( $handle, array( 'google-tag-manager' ), true ) ) {
return $tag;
}
// If script was output manually in wp_head, abort.
if ( did_action( 'woocommerce_gtag_snippet' ) ) {
return '';
}
return str_replace( '<script src', '<script async src', $tag );
}
}
Hydration.php 0000644 00000005322 15155647076 0007240 0 ustar 00 <?php
namespace Automattic\WooCommerce\Blocks\Domain\Services;
use Automattic\WooCommerce\Blocks\Assets\AssetDataRegistry;
/**
* Service class that handles hydration of API data for blocks.
*/
class Hydration {
/**
* Instance of the asset data registry.
*
* @var AssetDataRegistry
*/
protected $asset_data_registry;
/**
* Cached notices to restore after hydrating the API.
*
* @var array
*/
protected $cached_store_notices = [];
/**
* Constructor.
*
* @param AssetDataRegistry $asset_data_registry Instance of the asset data registry.
*/
public function __construct( AssetDataRegistry $asset_data_registry ) {
$this->asset_data_registry = $asset_data_registry;
}
/**
* Hydrates the asset data registry with data from the API. Disables notices and nonces so requests contain valid
* data that is not polluted by the current session.
*
* @param array $path API paths to hydrate e.g. '/wc/store/v1/cart'.
* @return array Response data.
*/
public function get_rest_api_response_data( $path = '' ) {
$this->cache_store_notices();
$this->disable_nonce_check();
// Preload the request and add it to the array. It will be $preloaded_requests['path'] and contain 'body' and 'headers'.
$preloaded_requests = rest_preload_api_request( [], $path );
$this->restore_cached_store_notices();
$this->restore_nonce_check();
// Returns just the single preloaded request.
return $preloaded_requests[ $path ];
}
/**
* Disable the nonce check temporarily.
*/
protected function disable_nonce_check() {
add_filter( 'woocommerce_store_api_disable_nonce_check', [ $this, 'disable_nonce_check_callback' ] );
}
/**
* Callback to disable the nonce check. While we could use `__return_true`, we use a custom named callback so that
* we can remove it later without affecting other filters.
*/
public function disable_nonce_check_callback() {
return true;
}
/**
* Restore the nonce check.
*/
protected function restore_nonce_check() {
remove_filter( 'woocommerce_store_api_disable_nonce_check', [ $this, 'disable_nonce_check_callback' ] );
}
/**
* Cache notices before hydrating the API if the customer has a session.
*/
protected function cache_store_notices() {
if ( ! did_action( 'woocommerce_init' ) || null === WC()->session ) {
return;
}
$this->cached_store_notices = WC()->session->get( 'wc_notices', array() );
WC()->session->set( 'wc_notices', null );
}
/**
* Restore notices into current session from cache.
*/
protected function restore_cached_store_notices() {
if ( ! did_action( 'woocommerce_init' ) || null === WC()->session ) {
return;
}
WC()->session->set( 'wc_notices', $this->cached_store_notices );
$this->cached_store_notices = [];
}
}
Notices.php 0000644 00000005451 15155647076 0006706 0 ustar 00 <?php
namespace Automattic\WooCommerce\Blocks\Domain\Services;
use Automattic\WooCommerce\Blocks\Domain\Package;
use Automattic\WooCommerce\Blocks\Utils\CartCheckoutUtils;
/**
* Service class for adding new-style Notices to WooCommerce core.
*
* @internal
*/
class Notices {
/**
* Holds the Package instance
*
* @var Package
*/
private $package;
/**
* Templates used for notices.
*
* @var array
*/
private $notice_templates = array(
'notices/error.php',
'notices/notice.php',
'notices/success.php',
);
/**
* Constructor
*
* @param Package $package An instance of the package class.
*/
public function __construct( Package $package ) {
$this->package = $package;
}
/**
* Set all hooks related to adding Checkout Draft order functionality to Woo Core. This is only enabled if the user
* is using the new block based cart/checkout.
*/
public function init() {
if ( CartCheckoutUtils::is_cart_block_default() || CartCheckoutUtils::is_checkout_block_default() ) {
add_filter( 'woocommerce_kses_notice_allowed_tags', [ $this, 'add_kses_notice_allowed_tags' ] );
add_filter( 'wc_get_template', [ $this, 'get_notices_template' ], 10, 5 );
add_action(
'wp_head',
function() {
// These pages may return notices in ajax responses, so we need the styles to be ready.
if ( is_cart() || is_checkout() ) {
wp_enqueue_style( 'wc-blocks-style' );
}
}
);
}
}
/**
* Allow SVG icon in notices.
*
* @param array $allowed_tags Allowed tags.
* @return array
*/
public function add_kses_notice_allowed_tags( $allowed_tags ) {
$svg_args = array(
'svg' => array(
'aria-hidden' => true,
'xmlns' => true,
'width' => true,
'height' => true,
'viewbox' => true,
'focusable' => true,
),
'path' => array(
'd' => true,
),
);
return array_merge( $allowed_tags, $svg_args );
}
/**
* Replaces core notice templates with those from blocks.
*
* The new notice templates match block components with matching icons and styling. The only difference is that core
* only has notices for info, success, and error notices, whereas blocks has notices for info, success, error,
* warning, and a default notice type.
*
* @param string $template Located template path.
* @param string $template_name Template name.
* @param array $args Template arguments.
* @param string $template_path Template path.
* @param string $default_path Default path.
* @return string
*/
public function get_notices_template( $template, $template_name, $args, $template_path, $default_path ) {
if ( in_array( $template_name, $this->notice_templates, true ) ) {
$template = $this->package->get_path( 'templates/' . $template_name );
wp_enqueue_style( 'wc-blocks-style' );
}
return $template;
}
}