1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* Forms Query |
4
|
|
|
* |
5
|
|
|
* @package Give |
6
|
|
|
* @subpackage Classes/Form |
7
|
|
|
* @copyright Copyright (c) 2019, GiveWP |
8
|
|
|
* @license https://opensource.org/licenses/gpl-license GNU Public License |
9
|
|
|
* @since 2.5.0 |
10
|
|
|
*/ |
11
|
|
|
|
12
|
|
|
// Exit if accessed directly. |
13
|
|
|
if ( ! defined( 'ABSPATH' ) ) { |
14
|
|
|
exit; |
15
|
|
|
} |
16
|
|
|
|
17
|
|
|
/** |
18
|
|
|
* Give_Forms_Query Class |
19
|
|
|
* Note: only for internal use. This class is under development, so use it at your risk. |
20
|
|
|
* |
21
|
|
|
* This class is for retrieving forms data. |
22
|
|
|
* |
23
|
|
|
* @since 2.5.0 |
24
|
|
|
*/ |
25
|
|
|
class Give_Forms_Query { |
26
|
|
|
/** |
27
|
|
|
* Preserve args |
28
|
|
|
* |
29
|
|
|
* @since 2.5.0 |
30
|
|
|
* @access public |
31
|
|
|
* |
32
|
|
|
* @var array |
33
|
|
|
*/ |
34
|
|
|
public $_args = array(); |
35
|
|
|
|
36
|
|
|
/** |
37
|
|
|
* The args to pass to the give_get_forms() query |
38
|
|
|
* |
39
|
|
|
* @since 2.5.0 |
40
|
|
|
* @access public |
41
|
|
|
* |
42
|
|
|
* @var array |
43
|
|
|
*/ |
44
|
|
|
public $args = array(); |
45
|
|
|
|
46
|
|
|
/** |
47
|
|
|
* The forms found based on the criteria set |
48
|
|
|
* |
49
|
|
|
* @since 2.5.0 |
50
|
|
|
* @access public |
51
|
|
|
* |
52
|
|
|
* @var array |
53
|
|
|
*/ |
54
|
|
|
public $forms = array(); |
55
|
|
|
|
56
|
|
|
/** |
57
|
|
|
* Default query arguments. |
58
|
|
|
* |
59
|
|
|
* Not all of these are valid arguments that can be passed to WP_Query. The ones that are not, are modified before |
60
|
|
|
* the query is run to convert them to the proper syntax. |
61
|
|
|
* |
62
|
|
|
* @since 2.5.0 |
63
|
|
|
* @access public |
64
|
|
|
* |
65
|
|
|
* @param $args array The array of arguments that can be passed in and used for setting up this form query. |
66
|
|
|
*/ |
67
|
|
|
public function __construct( $args = array() ) { |
68
|
|
|
$defaults = array( |
69
|
|
|
'output' => 'forms', |
70
|
|
|
'post_type' => array( 'give_forms' ), |
71
|
|
|
); |
72
|
|
|
|
73
|
|
|
// We do not want WordPress to handle meta cache because WordPress stores in under `post_meta` key and cache object while we want it under `form_meta`. |
74
|
|
|
// Similar for term cache |
75
|
|
|
$args['update_post_meta_cache'] = false; |
76
|
|
|
|
77
|
|
|
$this->args = $this->_args = wp_parse_args( $args, $defaults ); |
78
|
|
|
} |
79
|
|
|
|
80
|
|
|
/** |
81
|
|
|
* Retrieve forms. |
82
|
|
|
* |
83
|
|
|
* The query can be modified in two ways; either the action before the |
84
|
|
|
* query is run, or the filter on the arguments (existing mainly for backwards |
85
|
|
|
* compatibility). |
86
|
|
|
* |
87
|
|
|
* @since 2.5.0 |
88
|
|
|
* @access public |
89
|
|
|
* |
90
|
|
|
* @return array |
91
|
|
|
*/ |
92
|
|
View Code Duplication |
public function get_forms() { |
|
|
|
|
93
|
|
|
global $post; |
94
|
|
|
|
95
|
|
|
$results = array(); |
96
|
|
|
$this->forms = array(); |
97
|
|
|
$cache_key = Give_Cache::get_key( 'give_form_query', $this->args, false ); |
98
|
|
|
$this->forms = Give_Cache::get_db_query( $cache_key ); |
|
|
|
|
99
|
|
|
|
100
|
|
|
// Return cached result. |
101
|
|
|
if ( ! is_null( $this->forms ) ) { |
102
|
|
|
return $this->forms; |
103
|
|
|
} |
104
|
|
|
|
105
|
|
|
/* @var WP_Query $query */ |
106
|
|
|
$query = new WP_Query( $this->args ); |
107
|
|
|
|
108
|
|
|
$custom_output = array( |
109
|
|
|
'forms', |
110
|
|
|
'give_forms', |
111
|
|
|
); |
112
|
|
|
|
113
|
|
|
if ( $query->have_posts() ) { |
114
|
|
|
$this->update_meta_cache( wp_list_pluck( $query->posts, 'ID' ) ); |
115
|
|
|
|
116
|
|
|
if ( ! in_array( $this->args['output'], $custom_output ) ) { |
117
|
|
|
$results = $query->posts; |
118
|
|
|
|
119
|
|
|
} else { |
120
|
|
|
$previous_post = $post; |
121
|
|
|
|
122
|
|
|
while ( $query->have_posts() ) { |
123
|
|
|
$query->the_post(); |
124
|
|
|
|
125
|
|
|
$form_id = get_post()->ID; |
126
|
|
|
$form = new Give_Donate_Form( $form_id ); |
127
|
|
|
|
128
|
|
|
$this->forms[] = apply_filters( 'give_form', $form, $form_id, $this ); |
129
|
|
|
} |
130
|
|
|
|
131
|
|
|
wp_reset_postdata(); |
132
|
|
|
|
133
|
|
|
// Prevent nest loop from producing unexpected results. |
134
|
|
|
if ( $previous_post instanceof WP_Post ) { |
|
|
|
|
135
|
|
|
$post = $previous_post; |
|
|
|
|
136
|
|
|
setup_postdata( $post ); |
137
|
|
|
} |
138
|
|
|
|
139
|
|
|
$results = $this->forms; |
140
|
|
|
} |
141
|
|
|
} |
142
|
|
|
|
143
|
|
|
Give_Cache::set_db_query( $cache_key, $results ); |
144
|
|
|
|
145
|
|
|
return $results; |
146
|
|
|
} |
147
|
|
|
|
148
|
|
|
/** |
149
|
|
|
* Update forms meta cache |
150
|
|
|
* |
151
|
|
|
* @since 2.5.0 |
152
|
|
|
* @access private |
153
|
|
|
* |
154
|
|
|
* @param $form_ids |
155
|
|
|
*/ |
156
|
|
|
public static function update_meta_cache( $form_ids ) { |
157
|
|
|
// Exit. |
158
|
|
|
if ( empty( $form_ids ) ) { |
159
|
|
|
return; |
160
|
|
|
} |
161
|
|
|
|
162
|
|
|
update_meta_cache( Give()->form_meta->get_meta_type(), $form_ids ); |
163
|
|
|
} |
164
|
|
|
} |
165
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.