PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.5.8
GiveWP – Donation Plugin and Fundraising Platform v2.5.8
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 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.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / includes / admin / forms / class-give-form-duplicator.php
give / includes / admin / forms Last commit date
class-give-form-duplicator.php 6 years ago class-metabox-form-data.php 6 years ago dashboard-columns.php 6 years ago metabox.php 7 years ago
class-give-form-duplicator.php
263 lines
1 <?php
2 /**
3 * The class contains logic to clone a donation form.
4 *
5 * @package Give
6 * @subpackage Admin/Forms
7 * @copyright Copyright (c) 2018, GiveWP
8 * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
9 * @since 2.2.0
10 */
11
12 if ( ! class_exists( 'Give_Form_Duplicator' ) ) {
13
14 /**
15 * Give_Form_Duplicator class
16 */
17 class Give_Form_Duplicator {
18
19 /**
20 * Constructor Function
21 */
22 public function __construct() {
23
24 // Add the 'Clone Form' to Row Actions.
25 add_filter( 'post_row_actions', array( $this, 'row_action' ), 10, 2 );
26
27 // Run admin_action hook.
28 add_action( 'admin_action_give_duplicate_form', array( $this, 'handler' ) );
29 }
30
31
32 /**
33 * Adds the 'Clone Form' in the row actions.
34 *
35 * @param array $actions Array of Row Actions.
36 * @param WP_Post Object $post Post Object.
37 *
38 * @since 2.2.0
39 *
40 * @return array
41 */
42 public function row_action( $actions, $post ) {
43
44 // @codingStandardsIgnoreStart
45
46 if ( isset( $_GET['post_type'] ) && 'give_forms' === give_clean( $_GET['post_type'] ) ) { // WPCS: input var ok.
47 if ( current_user_can( 'edit_posts' ) ) {
48 $actions['duplicate_form'] = sprintf(
49 '<a href="%1$s">%2$s</a>',
50 wp_nonce_url( add_query_arg(
51 array(
52 'action' => 'give_duplicate_form',
53 'form_id' => $post->ID,
54 ),
55 admin_url( 'admin.php' )
56 ), 'give-duplicate-form' ),
57 __( 'Duplicate', 'give' )
58 );
59 }
60 }
61
62 // @codingStandardsIgnoreEnd
63
64 return $actions;
65 }
66
67
68 /**
69 * Clones the Form
70 *
71 * @since 2.2.0
72 *
73 * @return void
74 */
75 public function handler() {
76 // Validate action.
77 // @codingStandardsIgnoreStart
78 if (
79 ! isset( $_REQUEST['form_id'] )
80 || ! isset( $_REQUEST['action'] )
81 || ( 'give_duplicate_form' !== $_REQUEST['action'] )
82 ) {
83 wp_die( esc_html__( 'Form ID not found in the query string', 'give' ) );
84
85 } elseif ( ! wp_verify_nonce( give_clean( $_REQUEST['_wpnonce'] ), 'give-duplicate-form' ) ) {
86
87 wp_die( esc_html__( 'We\'re unable to recognize your session. Please refresh the screen to try again; otherwise contact your website administrator for assistance.', 'give' ) );
88 }
89 // @codingStandardsIgnoreEnd
90
91 $form_id = give_clean( $_REQUEST['form_id'] ); // @codingStandardsIgnoreLine
92 $post_data = get_post( $form_id );
93 $current_user = wp_get_current_user();
94 $error_notice = sprintf(
95 /* translators: %s: Form ID */
96 esc_html__( 'Cloning failed. Form with ID %s does not exist.', 'give' ),
97 absint( $form_id )
98 );
99
100 if ( isset( $post_data ) && null !== $post_data ) {
101
102 $args = array(
103 'comment_status' => $post_data->comment_status,
104 'ping_status' => $post_data->ping_status,
105 'post_author' => $current_user->ID,
106 'post_content' => $post_data->post_content,
107 'post_excerpt' => $post_data->post_excerpt,
108 'post_name' => $post_data->post_name,
109 'post_parent' => $post_data->post_parent,
110 'post_password' => $post_data->post_password,
111 'post_status' => 'draft',
112 'post_title' => $post_data->post_title,
113 'post_type' => $post_data->post_type,
114 'to_ping' => $post_data->to_ping,
115 'menu_order' => $post_data->menu_order,
116 );
117
118 // Get the ID of the cloned post.
119 $duplicate_form_id = wp_insert_post( $args );
120
121 $this->duplicate_taxonomies( $duplicate_form_id, $post_data );
122 $this->duplicate_meta_data( $duplicate_form_id, $post_data );
123 $this->reset_stats( $duplicate_form_id );
124
125 /**
126 * Fire the action
127 *
128 * @since 2.2.0
129 *
130 * @param int $duplicate_form_id Duplicated form ID.
131 * @param int $form_id Form ID.
132 */
133 do_action( 'give_form_duplicated', $duplicate_form_id, $form_id );
134
135 if ( ! is_wp_error( $duplicate_form_id ) ) {
136 // Redirect to the cloned form editor page.
137 wp_safe_redirect(
138 add_query_arg(
139 array(
140 'action' => 'edit',
141 'post' => $duplicate_form_id,
142 ),
143 admin_url( 'post.php' )
144 )
145 );
146 } else {
147 wp_die( $error_notice ); // @codingStandardsIgnoreLine
148 }
149
150 exit;
151
152 } else {
153
154 wp_die( $error_notice ); // @codingStandardsIgnoreLine
155 }
156 }
157
158
159 /**
160 * Clone taxonomies
161 *
162 * @since 2.2.0
163 * @access private
164 *
165 * @param int $new_form_id New form ID.
166 * @param WP_Post $old_form Old form object.
167 */
168 private function duplicate_taxonomies( $new_form_id, $old_form ) {
169 // Get the taxonomies of the post type `give_forms`.
170 $taxonomies = get_object_taxonomies( $old_form->post_type );
171
172 foreach ( $taxonomies as $taxonomy ) {
173
174 $post_terms = wp_get_object_terms(
175 $old_form->ID,
176 $taxonomy,
177 array(
178 'fields' => 'slugs',
179 )
180 );
181
182 wp_set_object_terms(
183 $new_form_id,
184 $post_terms,
185 $taxonomy,
186 false
187 );
188 }
189 }
190
191
192 /**
193 * Clone meta data
194 *
195 * @since 2.2.0
196 * @access private
197 *
198 * @param int $new_form_id New Form ID.
199 * @param WP_Post $old_form Old form object.
200 */
201 private function duplicate_meta_data( $new_form_id, $old_form ) {
202 global $wpdb;
203
204 // Clone the metadata of the form.
205 $post_meta_query = $wpdb->prepare( "SELECT meta_key, meta_value FROM {$wpdb->formmeta} WHERE form_id=%s", $old_form->ID );
206
207 $post_meta_data = $wpdb->get_results( $post_meta_query ); // WPCS: db call ok. WPCS: cache ok. WPCS: unprepared SQL OK.
208
209 if ( ! empty( $post_meta_data ) ) {
210
211 $duplicate_query = "INSERT INTO {$wpdb->formmeta} (form_id, meta_key, meta_value) ";
212 $duplicate_query_select = array();
213
214 foreach ( $post_meta_data as $meta_data ) {
215 $meta_key = $meta_data->meta_key;
216 $meta_value = $meta_data->meta_value;
217 $duplicate_query_select[] = $wpdb->prepare( 'SELECT %s, %s, %s', $new_form_id, $meta_key, $meta_value );
218 }
219
220 $duplicate_query .= implode( ' UNION ALL ', $duplicate_query_select );
221
222 $wpdb->query( $duplicate_query ); // WPCS: db call ok. WPCS: cache ok. WPCS: unprepared SQL OK.
223 }
224 }
225
226 /**
227 * Reset stats for cloned form
228 *
229 * @since 2.2.0
230 * @access private
231 *
232 * @param int $new_form_id New Form ID.
233 */
234 private function reset_stats( $new_form_id ) {
235 global $wpdb;
236
237 $meta_keys = array( '_give_form_sales', '_give_form_earnings' );
238
239 /**
240 * Fire the filter
241 *
242 * @since 2.2.0
243 */
244 $meta_keys = apply_filters( 'give_duplicate_form_reset_stat_meta_keys', $meta_keys );
245 $meta_keys = 'meta_key=\'' . implode( '\' OR meta_key=\'', $meta_keys ) . '\'';
246
247 $wpdb->query(
248 $wpdb->prepare(
249 "
250 UPDATE $wpdb->formmeta
251 SET meta_value=0
252 WHERE form_id=%d
253 AND ({$meta_keys})
254 ",
255 $new_form_id
256 )
257 );
258 }
259 }
260
261 new Give_Form_Duplicator();
262 }
263