PluginProbe
WCPOS – Point of Sale (POS) plugin for WooCommerce / 1.10.18
WCPOS – Point of Sale (POS) plugin for WooCommerce v1.10.18
1.10.19 1.10.18 1.10.17 1.10.16 1.10.15 1.10.13 1.10.14 1.10.12 1.10.11 1.10.10 1.10.9 1.10.8 untagged-3d9b7ccddc54df87c672 1.10.7 1.10.6 1.10.5 1.10.3 1.10.4 1.10.2 1.10.1 1.10.0 1.9.17 1.9.15 1.9.16 1.9.14 All 163 releases
← All changes | includes/API/Product_Search.php +23 -69 1.10.141.10.18 View file →
@@ -1,7 +1,7 @@
1 1 <?php
2 2 /**
3 - * Shared product search SQL filters.
3 + * Legacy WCPOS search API; retained for Pro for one release.
4 4 *
5 5 * @package WCPOS\WooCommercePOS\API
6 6 */
7 7
@@ -6,109 +6,63 @@
6 6 */
7 7
8 8 namespace WCPOS\WooCommercePOS\API;
9 9
10 -use WCPOS\WooCommercePOS\Services\Barcode_Field;
10 +use WCPOS\WooCommercePOS\Sync\Collection_Rules;
11 +use WCPOS\WooCommercePOS\Sync\Product_Search as Search_Rule;
11 12 use WP_Query;
12 13
13 14 /**
14 - * Keeps v1 and v2 product search fields identical.
15 + * Legacy search entry points.
16 + *
17 + * @deprecated Search is owned by Sync\Collection_Rules.
15 18 */
16 19 final class Product_Search {
17 20 /**
18 - * Search product titles, SKUs, and the configured barcode field.
21 + * Build product search SQL.
19 22 *
23 + * @deprecated Use the Collection Rules plan.
24 + *
20 25 * @param string $search Search SQL.
21 26 * @param WP_Query $wp_query Query instance.
22 27 * @return string
23 28 */
24 29 public static function posts_search( string $search, WP_Query $wp_query ): string {
25 - global $wpdb;
26 - $q = $wp_query->query_vars;
27 - $phrase = $q['wcpos_search_phrase'] ?? null;
28 - if ( empty( $search ) && null === $phrase ) {
29 - return $search;
30 - }
31 - $terms = null !== $phrase ? array( $phrase ) : (array) $q['search_terms'];
32 - $n = ! empty( $q['exact'] ) ? '' : '%';
33 - $meta_fields = Barcode_Field::search_keys();
34 - $meta_placeholders = implode( ', ', array_fill( 0, \count( $meta_fields ), '%s' ) );
35 - $search_conditions = array();
36 - foreach ( $terms as $term ) {
37 - $term = $n . $wpdb->esc_like( $term ) . $n;
38 - // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Table names come from $wpdb; $meta_placeholders is a generated list of %s placeholders, and the keys themselves are passed to prepare() as arguments.
39 - $search_conditions[] = $wpdb->prepare(
40 - "( {$wpdb->posts}.post_title LIKE %s OR EXISTS (
41 - SELECT 1 FROM {$wpdb->postmeta} AS wcpos_search_meta WHERE wcpos_search_meta.post_id = {$wpdb->posts}.ID AND wcpos_search_meta.meta_key IN ($meta_placeholders) AND wcpos_search_meta.meta_value LIKE %s
42 - ) )",
43 - array_merge( array( $term ), $meta_fields, array( $term ) )
44 - );
45 - // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
46 - }
47 -
48 - if ( ! empty( $search_conditions ) ) {
49 - $search = ' AND (' . implode( ' AND ', $search_conditions ) . ') ';
50 - if ( ! is_user_logged_in() ) {
51 - $search .= " AND ($wpdb->posts.post_password = '') ";
52 - }
53 - }
54 - return $search;
30 + return Search_Rule::posts_search( $search, $wp_query->query_vars, Collection_Rules::rules( 'products' )['search'] );
55 31 }
56 -
57 32 /**
58 - * Join product meta while searching.
33 + * Join product search metadata.
59 34 *
35 + * @deprecated Use the Collection Rules plan.
36 + *
60 37 * @param string $join JOIN SQL.
61 38 * @param WP_Query $query Query instance.
62 39 * @return string
63 40 */
64 41 public static function posts_join( string $join, WP_Query $query ): string {
65 - global $wpdb;
66 - if ( self::is_searching( $query ) && false === strpos( $join, 'pm1' ) ) {
67 - $join .= " LEFT JOIN {$wpdb->postmeta} pm1 ON {$wpdb->posts}.ID = pm1.post_id ";
68 - }
69 - return $join;
42 + return Search_Rule::posts_join( $join, $query->query_vars );
70 43 }
71 -
72 44 /**
73 - * Group product search results after joining meta.
45 + * Group product search results.
74 46 *
47 + * @deprecated Use the Collection Rules plan.
48 + *
75 49 * @param string $groupby GROUP BY SQL.
76 50 * @param WP_Query $query Query instance.
77 51 * @return string
78 52 */
79 53 public static function posts_groupby( string $groupby, WP_Query $query ): string {
80 - global $wpdb;
81 - if ( self::is_searching( $query ) ) {
82 - $groupby = "{$wpdb->posts}.ID";
83 - }
84 - return $groupby;
54 + return Search_Rule::posts_groupby( $groupby, $query->query_vars );
85 55 }
86 -
87 56 /**
88 - * Rank exact SKU or barcode matches ahead of substring matches.
57 + * Rank exact product matches.
89 58 *
59 + * @deprecated Use the Collection Rules plan.
60 + *
90 61 * @param string $orderby ORDER BY SQL.
91 62 * @param WP_Query $query Query instance.
63 + * @return string
92 64 */
93 65 public static function posts_orderby( string $orderby, WP_Query $query ): string {
94 - global $wpdb;
95 - if ( ! self::is_searching( $query ) ) {
96 - return $orderby;
97 - }
98 - $keys = Barcode_Field::search_keys();
99 - return $wpdb->prepare(
100 - 'MIN(CASE WHEN pm1.meta_key IN (' . implode( ', ', array_fill( 0, count( $keys ), '%s' ) ) . ') AND pm1.meta_value = %s THEN 0 ELSE 1 END) ASC',
101 - array_merge( $keys, array( trim( (string) ( $query->query_vars['wcpos_search_phrase'] ?? $query->query_vars['s'] ) ) ) )
102 - ) . ', ' . ( '' === trim( $orderby ) ? "{$wpdb->posts}.ID DESC" : $orderby );
103 - }
104 -
105 - /**
106 - * Whether the query carries a search term. Not empty(): the literal term "0" is a search.
107 - *
108 - * @param WP_Query $query Query instance.
109 - * @return bool
110 - */
111 - private static function is_searching( WP_Query $query ): bool {
112 - return '' !== (string) ( $query->query_vars['wcpos_search_phrase'] ?? $query->query_vars['s'] ?? '' );
66 + return Search_Rule::posts_orderby( $orderby, $query->query_vars, Collection_Rules::rules( 'products' )['search'] );
113 67 }
114 68 }