PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / trunk
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments vtrunk
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 / Routing / PermalinkSettingService.php
surecart / app / src / Routing Last commit date
AdminRouteService.php 4 months ago AdminRouteServiceProvider.php 3 years ago AdminURLService.php 1 month ago PermalinkService.php 1 year ago PermalinkServiceProvider.php 1 year ago PermalinkSettingService.php 1 year ago PermalinksSettingsService.php 1 year ago RouteConditionsServiceProvider.php 3 years ago
PermalinkSettingService.php
298 lines
1 <?php
2 namespace SureCart\Routing;
3
4 /**
5 * A service for handling permalink settings on the permalinks page.
6 */
7 class PermalinkSettingService {
8 /**
9 * The slug of the setting.
10 *
11 * @var string
12 */
13 protected $slug = '';
14
15 /**
16 * The label of the setting.
17 *
18 * @var string
19 */
20 protected $description = '';
21
22 /**
23 * The label of the setting.
24 *
25 * @var string
26 */
27 protected $label = '';
28
29 /**
30 * The permalinks for the setting.
31 *
32 * @var array
33 */
34 protected $options = [];
35
36 /**
37 * Currently saved base.
38 *
39 * @var string
40 */
41 protected $current_base = '';
42
43 /**
44 * The option key.
45 *
46 * @var string
47 */
48 protected $option_key = '';
49
50 /**
51 * Last part of the permalink. This is used to generate the preview.
52 *
53 * @var string
54 */
55 protected $sample_preview_text = '';
56
57 /**
58 * Build the permalink setting.
59 *
60 * @param array $args The arguments.
61 */
62 public function __construct( $args = [] ) {
63 $this->slug = $args['slug'] ?? '';
64 $this->label = $args['label'] ?? '';
65 $this->description = $args['description'] ?? '';
66 $this->options = $args['options'] ?? [];
67 $this->current_base = \SureCart::settings()->permalinks()->getBase( "{$this->slug}_page" );
68 $this->sample_preview_text = $args['sample_preview_text'] ?? 'sample-product';
69 }
70
71 /**
72 * Boostrap settings.
73 *
74 * @return void
75 */
76 public function bootstrap() {
77 add_action( 'admin_init', [ $this, 'settingsInit' ] );
78 }
79
80 /**
81 * Add translations.
82 *
83 * @return void
84 */
85 public function addTranslations() {
86 $translations['surecart.settings.permalinks.product'] = [
87 'slug' => 'product',
88 'label' => __( 'SureCart Product Permalinks', 'surecart' ),
89 /* translators: %s: Home URL */
90 'description' => sprintf( __( 'If you like, you may enter custom structures for your product page URLs here. For example, using <code>products</code> would make your product buy links like <code>%sproducts/sample-product/</code>.', 'surecart' ), esc_url( home_url( '/' ) ) ),
91 'options' => [
92 [
93 'value' => 'products',
94 'label' => __( 'Default', 'surecart' ),
95 ],
96 [
97 'value' => 'shop',
98 'label' => __( 'Shop', 'surecart' ),
99 ],
100 ],
101 ];
102
103 $translations['surecart.settings.permalinks.buy'] = [
104 'slug' => 'buy',
105 'label' => __( 'SureCart Instant Checkout Permalinks', 'surecart' ),
106 /* translators: %s: Home URL */
107 'description' => sprintf( __( 'If you like, you may enter custom structures for your instant checkout URLs here. For example, using <code>buy</code> would make your product buy links like <code>%sbuy/sample-product/</code>.', 'surecart' ), esc_url( home_url( '/' ) ) ),
108 'options' => [
109 [
110 'value' => 'buy',
111 'label' => __( 'Default', 'surecart' ),
112 ],
113 [
114 'value' => 'purchase',
115 'label' => __( 'Purchase', 'surecart' ),
116 ],
117 [
118 'value' => 'shop/%sc_collection%',
119 'label' => __( 'Shop base with collection', 'surecart' ),
120 ],
121 ],
122 ];
123
124 $translations['surecart.settings.permalinks.buy'] = [
125 'slug' => 'buy',
126 'label' => __( 'SureCart Instant Checkout Permalinks', 'surecart' ),
127 /* translators: %s: Home URL */
128 'description' => sprintf( __( 'If you like, you may enter custom structures for your instant checkout URLs here. For example, using <code>buy</code> would make your product buy links like <code>%sbuy/sample-product/</code>.', 'surecart' ), esc_url( home_url( '/' ) ) ),
129 'options' => [
130 [
131 'value' => 'buy',
132 'label' => __( 'Default', 'surecart' ),
133 ],
134 [
135 'value' => 'purchase',
136 'label' => __( 'Purchase', 'surecart' ),
137 ],
138 ],
139 ];
140
141 $translations['surecart.settings.permalinks.collection'] = [
142 'slug' => 'collection',
143 'label' => __( 'SureCart Product Collection Permalinks', 'surecart' ),
144 /* translators: %s: Home URL */
145 'description' => sprintf( __( 'If you like, you may enter custom structures for your product page URLs here. For example, using <code>collections</code> would make your product collection links like <code>%scollections/sample-collection/</code>.', 'surecart' ), esc_url( home_url( '/' ) ) ),
146 'options' => [
147 [
148 'value' => 'collections',
149 'label' => __( 'Default', 'surecart' ),
150 ],
151 [
152 'value' => 'product-collections',
153 'label' => __( 'Product Collections', 'surecart' ),
154 ],
155 ],
156 'sample_preview_text' => 'sample-collection',
157 ];
158
159 $translations['surecart.settings.permalinks.upsell'] = [
160 'slug' => 'upsell',
161 'label' => __( 'SureCart Upsell Permalinks', 'surecart' ),
162 /* translators: %s: Home URL */
163 'description' => sprintf( __( 'If you like, you may enter custom structures for your upsell URLs here. For example, using <code>offers</code> would make your upsell\'s links like <code>%soffers/upsell-id/</code>.', 'surecart' ), esc_url( home_url( '/' ) ) ),
164 'options' => [
165 [
166 'value' => 'offer',
167 'label' => __( 'Default', 'surecart' ),
168 ],
169 [
170 'value' => 'special-offer',
171 'label' => __( 'Special Offer', 'surecart' ),
172 ],
173 ],
174 ];
175 }
176
177 /**
178 * Initialize settings.
179 */
180 public function settingsInit() {
181 $this->addTranslations();
182 $this->addSettingsSection();
183 $this->maybeSaveSettings();
184 }
185
186 /**
187 * Add sections to permalinks page.
188 */
189 public function addSettingsSection() {
190 add_settings_section( "surecart-$this->slug-permalink", $this->label, [ $this, 'settings' ], 'permalink' );
191 }
192
193 /**
194 * Display the settings.
195 */
196 public function settings() {
197 echo wp_kses_post( wpautop( $this->description ) );
198
199 $values = array_values(
200 array_map(
201 function ( $permalink ) {
202 return trailingslashit( $permalink['value'] );
203 },
204 $this->options
205 )
206 );
207
208 ?>
209
210 <table class="form-table sc-<?php echo esc_attr( $this->slug ); ?>-permalink-structure">
211 <tbody>
212 <?php foreach ( $this->options as $permalink ) : ?>
213 <tr>
214 <th><label><input name="sc_<?php echo esc_attr( $this->slug ); ?>_permalink" type="radio" value="<?php echo esc_attr( $permalink['value'] ); ?>" class="sc-tog-<?php echo esc_attr( $this->slug ); ?>" <?php checked( $permalink['value'], $this->current_base ); ?> /> <?php echo esc_html( $permalink['label'] ); ?></label></th>
215 <td><code><?php echo esc_url( trailingslashit( home_url() ) . trailingslashit( ! empty( $permalink['display'] ) ? ltrim( $permalink['display'], '/' ) : $permalink['value'] ) . $this->sample_preview_text ); ?></code></td>
216 </tr>
217 <?php endforeach; ?>
218 <tr>
219 <th>
220 <label>
221 <input
222 name="sc_<?php echo esc_attr( $this->slug ); ?>_permalink"
223 id="surecart_<?php echo esc_attr( $this->slug ); ?>_custom_selection"
224 type="radio"
225 value="custom"
226 class="tog"
227 <?php
228 checked(
229 in_array(
230 $this->current_base,
231 array_map(
232 function ( $opt ) {
233 return $opt['value'];
234 },
235 $this->options
236 ),
237 true
238 ),
239 false
240 );
241 ?>
242 />
243 <?php esc_html_e( 'Custom base', 'surecart' ); ?>
244 </label>
245 </th>
246 <td>
247 <input name="sc_<?php echo esc_attr( $this->slug ); ?>_permalink_structure" id="surecart_<?php echo esc_attr( $this->slug ); ?>_permalink_structure" type="text" value="<?php echo esc_attr( ! in_array( $this->current_base, [ $values ], true ) ? untrailingslashit( $this->current_base ) : '' ); ?>" class="regular-text code"> <span class="description"><?php esc_html_e( 'Enter a custom base to use. A base must be set or WordPress will use default instead.', 'surecart' ); ?></span>
248 </td>
249 </tr>
250 </tbody>
251 </table>
252
253 <?php wp_nonce_field( 'surecart-permalinks', 'surecart-permalinks-nonce' ); ?>
254
255 <script>
256 jQuery( function() {
257 jQuery('input.sc-tog-<?php echo esc_attr( $this->slug ); ?>').on( 'change', function() {
258 jQuery('#surecart_<?php echo esc_attr( $this->slug ); ?>_permalink_structure').val( jQuery( this ).val() );
259 });
260 jQuery('.sc-<?php echo esc_attr( $this->slug ); ?>-permalink-structure input:checked').trigger( 'change' );
261 jQuery('#surecart_<?php echo esc_attr( $this->slug ); ?>_permalink_structure').on( 'focus', function(){
262 jQuery('#surecart_<?php echo esc_attr( $this->slug ); ?>_custom_selection').trigger( 'click' );
263 } );
264 } );
265 </script>
266 <?php
267 }
268
269 /**
270 * Save the settings.
271 */
272 public function maybeSaveSettings() {
273 if ( ! is_admin() ) {
274 return;
275 }
276
277 $structure_key = 'sc_' . esc_attr( $this->slug ) . '_permalink_structure';
278 $permalink_key = 'sc_' . esc_attr( $this->slug ) . '_permalink';
279
280 // we must have our permalink post data and nonce.
281 if ( ! isset( $_POST[ $structure_key ], $_POST[ $permalink_key ] ) || ! wp_verify_nonce( wp_unslash( $_POST['surecart-permalinks-nonce'] ), 'surecart-permalinks' ) ) { // WPCS: input var ok, sanitization ok.
282 return;
283 }
284
285 // get the buy base.
286 $page = isset( $_POST[ $permalink_key ] ) ? sanitize_text_field( wp_unslash( $_POST[ $permalink_key ] ) ) : '';
287 $page_struct = isset( $_POST[ $structure_key ] ) ? sanitize_text_field( wp_unslash( $_POST[ $structure_key ] ) ) : '';
288
289 if ( 'custom' === $page ) {
290 $page = ! empty( $_POST[ $structure_key ] ) ? preg_replace( '#/+#', '/', '/' . str_replace( '#', '', trim( wp_unslash( $_POST[ $structure_key ] ) ) ) ) : $this->options[0]['value']; // WPCS: input var ok, sanitization ok.
291 } elseif ( empty( $page ) ) {
292 $page = $this->options[0]['value'];
293 }
294
295 \SureCart::settings()->permalinks()->updatePermalinkSettings( $this->slug . '_page', $page );
296 }
297 }
298