PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.5.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.5.0
4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / WordPress / CurrencyService.php
surecart / app / src / WordPress Last commit date
Admin 2 months ago Assets 2 weeks ago CLI 2 years ago Cache 2 weeks ago Pages 10 months ago PostTypes 2 months ago Posts 1 year ago Shortcodes 1 month ago Taxonomies 1 year ago Templates 1 year ago Users 2 months ago ActionsService.php 3 years ago CompatibilityService.php 4 months ago CurrencyService.php 4 months ago GoogleMapApiService.php 2 months ago HealthService.php 2 months ago LineItemStateService.php 2 years ago PluginActionLinksService.php 1 year ago PluginService.php 1 year ago PluginServiceProvider.php 1 year ago RecaptchaValidationService.php 2 years ago StateService.php 7 months ago ThemeService.php 4 months ago ThemeServiceProvider.php 7 months ago TranslationsServiceProvider.php 3 months ago UpgradeNoticeService.php 1 year ago
CurrencyService.php
240 lines
1 <?php
2
3 namespace SureCart\WordPress;
4
5 /**
6 * Currency Service
7 */
8 class CurrencyService {
9
10 /**
11 * Should convert currency?
12 *
13 * @var bool
14 */
15 public $is_converting = false;
16
17 /**
18 * Filter URLs
19 *
20 * @var bool
21 */
22 private static $filter_url = true;
23
24 /**
25 * Bootstrap the currency service.
26 *
27 * @return void
28 */
29 public function bootstrap() {
30 // Set the currency cookie.
31 add_action( 'plugins_loaded', array( $this, 'setCurrencyCookie' ) );
32
33 // add the currency switcher menu.
34 add_filter( 'wp_nav_menu_items', array( $this, 'addCurrencySwitcherMenu' ), 10, 2 );
35
36 // set the urls.
37 add_action( 'init', [ $this, 'appendUrls' ] );
38 }
39
40 /**
41 * Initialize the currency service.
42 *
43 * @return void
44 */
45 public function appendUrls() {
46 add_filter( 'page_link', array( $this, 'maybeAddCurrencyParam' ), 99 );
47 add_filter( 'post_link', array( $this, 'maybeAddCurrencyParam' ), 99 );
48 add_filter( 'term_link', array( $this, 'maybeAddCurrencyParam' ), 99 );
49 add_filter( 'post_type_link', array( $this, 'maybeAddCurrencyParam' ), 99 );
50 add_filter( 'attachment_link', array( $this, 'maybeAddCurrencyParam' ), 99 );
51 add_filter( 'home_url', array( $this, 'addCurrencyParamToHomeUrl' ), 99, 3 );
52 add_filter( 'get_canonical_url', array( $this, 'removeCurrencyParam' ) );
53 add_filter( 'get_pagenum_link', array( $this, 'filterPagenumLink' ), 99, 2 );
54 }
55
56 /**
57 * Filter paginate link
58 *
59 * @param string $result The page number link.
60 * @param int $pagenum The page number.
61 *
62 * @return string
63 */
64 public function filterPagenumLink( $result, $pagenum ) {
65 if ( self::$filter_url ) {
66 remove_filter( 'get_pagenum_link', array( $this, 'filterPagenumLink' ), 99 );
67 self::$filter_url = false;
68 $result = get_pagenum_link( $pagenum, false );
69 add_filter( 'get_pagenum_link', array( $this, 'filterPagenumLink' ), 99, 2 );
70 self::$filter_url = true;
71 }
72
73 return $result;
74 }
75
76 /**
77 * Set the currency cookie.
78 *
79 * @return void
80 */
81 public function setCurrencyCookie() {
82 if ( isset( $_GET['currency'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
83 sc_setcookie( 'sc_current_currency', $_GET['currency'], time() + 7 * DAY_IN_SECONDS ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
84 }
85 }
86
87 /**
88 * Add the currency switcher menu.
89 *
90 * @param string $items The menu items.
91 * @param object $args The menu arguments.
92 *
93 * @return string The menu items.
94 */
95 public function addCurrencySwitcherMenu( $items, $args ) {
96 $menu = wp_get_nav_menu_object( $args->menu );
97 $id = $menu ? $menu->term_id : false;
98
99 $currency_switcher_selected_ids = get_option( 'surecart_currency_switcher_selected_ids', [] );
100
101 // if we don't have a menu id, or it's not in the selected ids, bail.
102 if ( empty( $id ) || ! in_array( $id, $currency_switcher_selected_ids, true ) ) {
103 return $items;
104 }
105
106 $cart_menu_alignment = (string) get_option( 'surecart_currency_switcher_alignment', 'right' );
107
108 $menu = '<li class="menu-item"><div class="menu-link">' . do_blocks(
109 '<!-- wp:surecart/currency-switcher ' . wp_json_encode(
110 apply_filters(
111 'surecart/currency/switcher_attributes',
112 [
113 'position' => 'right' === $cart_menu_alignment ? 'right' : 'left',
114 ]
115 )
116 ) . ' /-->'
117 ) . '</div></li>';
118
119 // left or right.
120 $items = 'right' === $cart_menu_alignment ? $items . $menu : $menu . $items;
121
122 return $items;
123 }
124 /**
125 * Convert currency.
126 *
127 * @param bool $convert Convert.
128 *
129 * @return void
130 */
131 public function convert( $convert = true ) {
132 $this->is_converting = $convert;
133 }
134
135 /**
136 * Maybe Filter the link to add the currency parameter.
137 *
138 * @param string $permalink The permalink to filter.
139 *
140 * @return string The permalink or the filtered permalink.
141 */
142 public function maybeAddCurrencyParam( $permalink ) {
143 if ( ! $this->shouldModifyUrl() ) {
144 return $permalink;
145 }
146
147 return $this->addCurrencyParam( $permalink );
148 }
149
150 /**
151 * Filter the link to add the currency parameter.
152 *
153 * @param string $permalink The permalink to filter.
154 *
155 * @return string The filtered permalink.
156 */
157 public function addCurrencyParam( $permalink ) {
158 if ( apply_filters( 'surecart/currency/filter_url', self::$filter_url, $permalink ) && ! $this->isSitemapOrFeedRequest() ) {
159 // we can't use the Currency::getCurrencyFromRequest here because we don't want to fetch display currencies potentially multiple times per request.
160 $currency = strtolower( sanitize_text_field( $_GET['currency'] ?? $_COOKIE['sc_current_currency'] ?? '' ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
161 if ( ! empty( $currency ) && strtolower( $currency ) !== strtolower( \SureCart::account()->currency ?? '' ) ) {
162 $permalink = add_query_arg( compact( 'currency' ), $permalink );
163 }
164 }
165
166 return $permalink;
167 }
168
169 /**
170 * Check if the request is an XML request.
171 *
172 * @return bool
173 */
174 private function isSitemapOrFeedRequest(): bool {
175 global $wp;
176
177 if ( is_feed() || is_robots() || wp_is_xml_request() ) {
178 return true;
179 }
180
181 // Don't filter XML requests.
182 if ( ! empty( $wp->request ) && preg_match( '/\.xml$/', $wp->request ) ) {
183 return true;
184 }
185
186 // In case of a custom XML request.
187 if ( ! empty( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '.xml' ) !== false ) {
188 return true;
189 }
190
191 return false;
192 }
193
194 /**
195 * Filter Home URL
196 *
197 * @param string $url Url.
198 * @param string $path Path.
199 * @param string $scheme Scheme.
200 *
201 * @return string
202 */
203 public function addCurrencyParamToHomeUrl( $url, $path, $scheme ) {
204 if ( ! $this->shouldModifyUrl( $path, $scheme ) ) {
205 return $url;
206 }
207
208 return $this->addCurrencyParam( $url );
209 }
210
211 /**
212 * Determines if the URL should be modified with currency parameter.
213 *
214 * @param string $path Optional. The path for home_url. Default empty string.
215 * @param string $scheme Optional. The scheme for requests. Default empty string.
216 *
217 * @return bool Whether the URL should be modified.
218 */
219 protected function shouldModifyUrl( $path = '', $scheme = '' ) {
220 // Return false if any of these conditions are true (don't modify URL).
221 return empty( $path ) &&
222 ! is_admin() &&
223 ! ( defined( 'REST_REQUEST' ) && REST_REQUEST ) &&
224 ! wp_doing_ajax() &&
225 ! $this->isSitemapOrFeedRequest() &&
226 'rest' !== $scheme;
227 }
228
229 /**
230 * Remove the currency parameter from the canonical permalink.
231 *
232 * @param string $permalink The permalink to filter.
233 *
234 * @return string The filtered permalink.
235 */
236 public function removeCurrencyParam( $permalink ) {
237 return remove_query_arg( 'currency', $permalink );
238 }
239 }
240