PluginProbe
IdeaPush / 1.23
IdeaPush v1.23
trunk 1.11 1.13 1.14 1.15 1.16 1.2 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.3 1.4 1.5 1.6 1.7 2.0 2.2 2.4 3.0 3.10 3.11 All 78 releases
ideapush / ideapush.php

ideapush.php in IdeaPush 1.23, at ideapush.php

1,161 lines 34.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /*
3 * Plugin Name: IdeaPush - Feature Request Manager
4 * Plugin URI: https://www.northernbeacheswebsites.com.au
5 * Description: IdeaPush is a feature request management system for WordPress
6 * Version: 1.23
7 * Author: Martin Gibson
8 * Text Domain: ideapush
9 * Support: https://www.northernbeacheswebsites.com.au/contact
10 * Licence: GPL2
11 */
12
13 // Assign global variables
14 global $ideapush_is_pro;
15 $ideapush_is_pro = "NO";
16
17
18 //the first YES/NO in the array is if the feature is pro, the second YES/NO in the array is if a save settings button is necessary
19 global $ideapush_pro_features;
20 $ideapush_pro_features = array('Boards' => array('NO','YES'),'Notifications' => array('NO','YES'), 'Statuses' => array('NO','YES'), 'Design' => array('NO','YES'), 'Idea Form' => array('NO','YES'), 'IdeaPush Support' => array('NO','NO'),'IdeaPush Pro' => array('YES','YES'),'Integrations' => array('YES','YES'));
21
22 //get plugin version number
23 function idea_push_plugin_get_version() {
24 if ( ! function_exists( 'get_plugins' ) )
25 require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
26 $plugin_folder = get_plugins( '/' . plugin_basename( dirname( __FILE__ ) ) );
27 $plugin_file = basename( ( __FILE__ ) );
28 return $plugin_folder[$plugin_file]['Version'];
29 }
30
31
32 function idea_push_create_custom_post_type() {
33
34 //SVG of the icon
35 $menu_icon_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMiIgYmFzZVByb2ZpbGU9InRpbnkiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgoJIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8cGF0aCBmaWxsPSIjNzhDMTQ4IiBkPSJNMTAsMEM0LjUsMCwwLDQuNSwwLDEwczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTUuNSwwLDEwLDB6IE04LjEsMTIuMWwtMS42LDEuNQoJYy0wLjIsMC4yLTAuNCwwLjMtMC43LDAuM2MtMC4zLDAtMC41LTAuMS0wLjctMC4zbC0xLjYtMS41Yy0wLjItMC4yLTAuMi0wLjYsMC0wLjljMC4yLTAuMiwwLjYtMC4yLDAuOSwwbDEuNCwxLjRsMS40LTEuNAoJQzcuMywxMS4xLDcuNSwxMSw3LjYsMTFzMC4zLDAuMSwwLjQsMC4yQzguMywxMS40LDguMywxMS44LDguMSwxMi4xeiBNOC4xLDlDNy45LDkuMSw3LjgsOS4yLDcuNiw5LjJTNy4zLDkuMSw3LjIsOUw1LjgsNy42TDQuNCw5CglDNC4yLDkuMiwzLjgsOS4yLDMuNiw5Yy0wLjItMC4yLTAuMi0wLjYsMC0wLjlsMS42LTEuNWMwLjItMC4yLDAuNC0wLjMsMC43LTAuM2MwLjMsMCwwLjUsMC4xLDAuNywwLjNsMS42LDEuNQoJQzguMyw4LjQsOC4zLDguOCw4LjEsOXogTTE1LjIsMTRoLTQuNmMtMC44LDAtMS40LTAuNi0xLjQtMS40YzAtMC44LDAuNi0xLjQsMS40LTEuNGg0LjZjMC44LDAsMS40LDAuNiwxLjQsMS40CglDMTYuNiwxMy4zLDE2LDE0LDE1LjIsMTR6IE0xNS4yLDkuMmgtNC42Yy0wLjgsMC0xLjQtMC42LTEuNC0xLjRjMC0wLjgsMC42LTEuNCwxLjQtMS40aDQuNmMwLjgsMCwxLjQsMC42LDEuNCwxLjQKCUMxNi42LDguNSwxNiw5LjIsMTUuMiw5LjJ6Ii8+Cjwvc3ZnPgo=';
36
37 // Set UI labels for Custom Post Type
38 $labels = array(
39 'name' => _x( 'Ideas', 'Post Type General Name', 'ideapush' ),
40 'singular_name' => _x( 'Idea', 'Post Type Singular Name', 'ideapush' ),
41 'menu_name' => __( 'IdeaPush', 'ideapush' ),
42 'parent_item_colon' => __( 'Parent Idea', 'ideapush' ),
43 'all_items' => __( 'All Ideas', 'ideapush' ),
44 'view_item' => __( 'View Idea', 'ideapush' ),
45 'add_new_item' => __( 'Add New Idea', 'ideapush' ),
46 'add_new' => __( 'Add New', 'ideapush' ),
47 'edit_item' => __( 'Edit Idea', 'ideapush' ),
48 'update_item' => __( 'Update Idea', 'ideapush' ),
49 'search_items' => __( 'Search Idea', 'ideapush' ),
50 'not_found' => __( 'Not Found', 'ideapush' ),
51 'not_found_in_trash' => __( 'Not found in Trash', 'ideapush' ),
52 );
53
54 // Set other options for Custom Post Type
55 $args = array(
56 'label' => __( 'ideas', 'ideapush' ),
57 'description' => __( 'IdeaPush ideas', 'ideapush' ),
58 'labels' => $labels,
59 // Features this CPT supports in Post Editor
60 // 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'comments', 'revisions', 'custom-fields',),
61 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'comments', 'revisions',),
62
63 // You can associate this CPT with a taxonomy or custom taxonomy.
64 'taxonomies' => array( 'idea-boards' ),
65 /* A hierarchical CPT is like Pages and can have
66 * Parent and child items. A non-hierarchical CPT
67 * is like Posts.
68 */
69 'hierarchical' => false,
70 'public' => true,
71 'show_ui' => true,
72 'show_in_menu' => true,
73 'show_in_nav_menus' => true,
74 'show_in_admin_bar' => true,
75 'menu_position' => 5,
76 'menu_icon' => $menu_icon_svg,
77 'can_export' => true,
78 'has_archive' => true,
79 'exclude_from_search' => false,
80 'publicly_queryable' => true,
81 'capability_type' => 'page',
82 );
83
84 // Registering your Custom Post Type
85 register_post_type( 'idea', $args );
86
87 }
88
89 /* Hook into the 'init' action so that the function
90 * Containing our post type registration is not
91 * unnecessarily executed.
92 */
93
94 add_action( 'init', 'idea_push_create_custom_post_type', 0 );
95
96
97 //when activating or deactivating the plugin lets fluch the rewrite rules because otherwise the single post pages may produce an error
98 register_deactivation_hook( __FILE__, 'flush_rewrite_rules' );
99 register_activation_hook( __FILE__, 'idea_push_flush_rewrites' );
100 function idea_push_flush_rewrites() {
101 // call your CPT registration function here (it should also be hooked into 'init')
102 idea_push_create_custom_post_type();
103 flush_rewrite_rules();
104
105
106 remove_role( 'idea_push_guest' );
107
108 //lets also create a new user role for guests
109 // add_role( 'idea_push_guest', 'IdeaPush Guest', array( 'read' => true, 'level_0' => true, 'manage_tags' => true,'edit_tags' => true) );
110
111 add_role( 'idea_push_guest', 'IdeaPush Guest', array( 'read' => true, 'level_0' => true));
112
113 }
114
115
116
117 //add a settings link on the plugin page
118 function idea_push_add_settings_link( $links ) {
119 $settings_link = '<a href="edit.php?post_type=idea&page=idea_push_settings">' . __( 'Settings','ideapush' ) . '</a>';
120 $ideas_link = '<a href="edit.php?post_type=idea">' . __( 'All Ideas','ideapush' ) . '</a>';
121 array_unshift( $links, $settings_link );
122 array_unshift( $links, $ideas_link );
123
124
125 return $links;
126 }
127 $plugin = plugin_basename( __FILE__ );
128 add_filter( "plugin_action_links_$plugin", 'idea_push_add_settings_link' );
129
130
131
132 //create boards taxonomy
133 add_action( 'init', 'idea_push_create_taxonomy_boards', 0 );
134
135 function idea_push_create_taxonomy_boards() {
136
137 // Labels part for the GUI
138
139 $labels = array(
140 'name' => _x( 'Boards', 'taxonomy general name' ),
141 'singular_name' => _x( 'Board', 'taxonomy singular name' ),
142 'search_items' => __( 'Search Boards' ),
143 'popular_items' => __( 'Popular Boards' ),
144 'all_items' => __( 'All Boards' ),
145 'parent_item' => null,
146 'parent_item_colon' => null,
147 'edit_item' => __( 'Edit Board' ),
148 'update_item' => __( 'Update Board' ),
149 'add_new_item' => __( 'Add New Board' ),
150 'new_item_name' => __( 'New Board Name' ),
151 'separate_items_with_commas' => __( 'Separate boards with commas' ),
152 'add_or_remove_items' => __( 'Add or remove boards' ),
153 'choose_from_most_used' => __( 'Choose from the most used boards' ),
154 'menu_name' => __( 'Boards' ),
155 );
156
157 // Now register the non-hierarchical taxonomy like tag
158
159 register_taxonomy('boards','idea',array(
160 'hierarchical' => true,
161 'labels' => $labels,
162 'show_ui' => true,
163 'show_in_menu' => false,
164 'show_in_nav_menus' => false,
165 'show_admin_column' => true,
166 'update_count_callback' => '_update_post_term_count',
167 'query_var' => true,
168 'rewrite' => array( 'slug' => 'ip-board' ),
169 ));
170
171 }
172
173
174 //create tags taxonomy
175 add_action( 'init', 'idea_push_create_taxonomy_tags', 0 );
176
177 function idea_push_create_taxonomy_tags() {
178
179 // Labels part for the GUI
180
181 $labels = array(
182 'name' => _x( 'Tags', 'taxonomy general name' ),
183 'singular_name' => _x( 'Tag', 'taxonomy singular name' ),
184 'search_items' => __( 'Search tags' ),
185 'popular_items' => __( 'Popular Tags' ),
186 'all_items' => __( 'All Tags' ),
187 'parent_item' => null,
188 'parent_item_colon' => null,
189 'edit_item' => __( 'Edit Tag' ),
190 'update_item' => __( 'Update Tag' ),
191 'add_new_item' => __( 'Add New Tag' ),
192 'new_item_name' => __( 'New Tag Name' ),
193 'separate_items_with_commas' => __( 'Separate tags with commas' ),
194 'add_or_remove_items' => __( 'Add or remove tags' ),
195 'choose_from_most_used' => __( 'Choose from the most used tags' ),
196 'menu_name' => __( 'Tags' ),
197 );
198
199 // Now register the non-hierarchical taxonomy like tag
200
201 register_taxonomy('tags','idea',array(
202 'hierarchical' => false,
203 'labels' => $labels,
204 'show_ui' => true,
205 'show_in_menu' => true,
206 'show_in_nav_menus' => false,
207 'show_admin_column' => true,
208 'update_count_callback' => '_update_post_term_count',
209 'query_var' => true,
210 'rewrite' => array( 'slug' => 'ip-tag' ),
211 // 'capabilities' => array (
212 // 'manage_terms' => 'read', //by default only admin
213 // 'edit_terms' => 'manage_tags',
214 // 'delete_terms' => 'manage_tags',
215 // 'assign_terms' => 'edit_tags'
216 // ),
217 ));
218
219 }
220
221
222
223 //create status taxonomy
224 add_action( 'init', 'idea_push_create_taxonomy_status', 0 );
225
226 function idea_push_create_taxonomy_status() {
227
228 // Labels part for the GUI
229
230 $labels = array(
231 'name' => _x( 'Status', 'taxonomy general name' ),
232 'singular_name' => _x( 'Status', 'taxonomy singular name' ),
233 'search_items' => __( 'Search Statuses' ),
234 'popular_items' => __( 'Popular Statuses' ),
235 'all_items' => __( 'All Statuses' ),
236 'parent_item' => null,
237 'parent_item_colon' => null,
238 'edit_item' => __( 'Edit Status' ),
239 'update_item' => __( 'Update Status' ),
240 'add_new_item' => __( 'Add New Status' ),
241 'new_item_name' => __( 'New Status Name' ),
242 'separate_items_with_commas' => __( 'Separate statuses with commas' ),
243 'add_or_remove_items' => __( 'Add or remove statuses' ),
244 'choose_from_most_used' => __( 'Choose from the most used statuses' ),
245 'menu_name' => __( 'Statuses' ),
246 );
247
248 // Now register the non-hierarchical taxonomy like tag
249
250 register_taxonomy('status','idea',array(
251 'hierarchical' => true,
252 'labels' => $labels,
253 'show_ui' => true,
254 'show_in_quick_edit' => false,
255 'show_in_menu' => false,
256 'show_in_nav_menus' => false,
257 'show_admin_column' => true,
258 'update_count_callback' => '_update_post_term_count',
259 'query_var' => true,
260 'rewrite' => array( 'slug' => 'ip-status' ),
261 ));
262
263 }
264
265
266
267
268 //create predefined statuses
269 add_action( 'init', 'idea_push_create_predefined_statuses', 0 );
270
271 function idea_push_create_predefined_statuses() {
272
273 if(get_term_by('name', 'Open', 'status') == false){
274 wp_insert_term(
275 'Open', // the term
276 'status', // the taxonomy
277 array(
278 'description'=> '',
279 'slug' => 'open'
280 )
281 );
282 }
283
284 if(get_term_by('name', 'Reviewed', 'status') == false){
285 wp_insert_term(
286 'Reviewed', // the term
287 'status', // the taxonomy
288 array(
289 'description'=> '',
290 'slug' => 'reviewed'
291 )
292 );
293 }
294
295 if(get_term_by('name', 'Approved', 'status') == false){
296 wp_insert_term(
297 'Approved', // the term
298 'status', // the taxonomy
299 array(
300 'description'=> '',
301 'slug' => 'approved'
302 )
303 );
304 }
305
306 if(get_term_by('name', 'Declined', 'status') == false){
307 wp_insert_term(
308 'Declined', // the term
309 'status', // the taxonomy
310 array(
311 'description'=> '',
312 'slug' => 'declined'
313 )
314 );
315 }
316
317 if(get_term_by('name', 'In Progress', 'status') == false){
318 wp_insert_term(
319 'In Progress', // the term
320 'status', // the taxonomy
321 array(
322 'description'=> '',
323 'slug' => 'in-progress'
324 )
325 );
326 }
327
328 if(get_term_by('name', 'Completed', 'status') == false){
329 wp_insert_term(
330 'Completed', // the term
331 'status', // the taxonomy
332 array(
333 'description'=> '',
334 'slug' => 'completed'
335 )
336 );
337 }
338
339
340
341
342 }
343
344
345
346
347
348
349
350
351
352
353 //lets add our settings page
354 add_action( 'admin_menu', 'idea_push_add_settings_page' );
355 add_action( 'admin_init', 'idea_push_settings_init' );
356
357 function idea_push_add_settings_page() {
358
359 global $idea_push_wp_settings_page;
360
361 $idea_push_wp_settings_page = add_submenu_page('edit.php?post_type=idea', __('Settings','ideapush'), __('Settings','ideapush'), 'manage_options', 'idea_push_settings', 'idea_push_settings_page_content');
362
363 }
364
365 //callback function of setting page
366 function idea_push_settings_page_content(){
367 require('inc/options/options-page-wrapper.php');
368 }
369
370 //Gets, sets and renders options
371 require('inc/options/options-output.php');
372
373 //produces the shortcode
374 require('inc/shortcode/ideaboard-shortcode.php');
375
376 //function that generates list items
377 require('inc/shortcode/idea-list-items.php');
378
379 //function that creates the idea form
380 require('inc/shortcode/create-idea-form.php');
381
382 //function that creates the idea table header
383 require('inc/shortcode/idea-table-header.php');
384
385 //function that creates ideas
386 require('inc/functions/create-idea.php');
387
388 //function that creates votes
389 require('inc/functions/create-vote.php');
390
391 //function that changes the status
392 require('inc/functions/status-change.php');
393
394 //common functions that assist other functions run
395 require('inc/functions/helper-functions.php');
396
397 //function that creates a user
398 require('inc/functions/create-user.php');
399
400 //function puts idea stuff on the single idea page
401 require('inc/functions/single-idea.php');
402
403 //function that adds our metabox
404 require('inc/functions/create-metaboxes.php');
405
406 //function that creates user profile image
407 require('inc/functions/user-profile-image.php');
408
409
410
411 //get pro options
412 if($ideapush_is_pro=="YES"){
413 require('inc/pro-ip/idea-push-pro.php');
414 }
415
416
417
418
419 function test(){
420
421 $current = get_current_screen();
422 print_r($current);
423 }
424 add_action('admin_init','test');
425
426
427
428
429 // Load admin style and scripts
430 function idea_push_register_admin_styles($hook)
431 {
432
433
434 global $pagenow;
435
436 global $idea_push_wp_settings_page;
437 global $idea_push_wp_reports_page;
438
439 if('profile.php' == $pagenow){
440 //display on user profile page
441 wp_enqueue_media();
442 wp_enqueue_script( 'user-profile-script-ideapush', plugins_url( '/inc/js/userprofile.js', __FILE__ ), array( 'jquery' ));
443 }
444
445
446 if($hook != $idea_push_wp_reports_page && $hook != $idea_push_wp_settings_page ){
447 return;
448
449 } else {
450 //css
451 wp_enqueue_style( 'wp-color-picker' );
452 wp_enqueue_style( 'custom-admin-style-ideapush', plugins_url( '/inc/css/adminstyle.css', __FILE__ ));
453 wp_enqueue_style( 'font-awesome', plugins_url( '/inc/css/font-awesome.min.css', __FILE__ ));
454
455 //js
456 wp_enqueue_script( 'custom-admin-script-ideapush', plugins_url( '/inc/js/adminscript.js', __FILE__ ), array( 'jquery','wp-color-picker' ));
457 wp_enqueue_script('jquery-ui-dialog');
458 wp_enqueue_script('jquery-ui-accordion');
459 wp_enqueue_script('jquery-ui-tabs');
460 wp_enqueue_script('jquery-ui-datepicker');
461 wp_enqueue_script('jquery-form');
462
463
464 wp_enqueue_script('clipboard', plugins_url('/inc/js/clipboard.min.js', __FILE__ ), array( 'jquery'));
465
466 }
467
468
469
470
471
472
473
474
475 }
476 add_action( 'admin_enqueue_scripts', 'idea_push_register_admin_styles' );
477
478
479
480 // Load styles and scripts for the single idea page
481 function idea_push_register_admin_styles_single()
482 {
483
484 global $post_type;
485
486 if('idea' != $post_type)
487 return;
488
489 //css
490
491 //js
492 wp_enqueue_script( 'custom-frontend-script-single-idea', plugins_url( '/inc/js/singleideascript.js', __FILE__ ), array( 'jquery'), '1.0.0');
493
494 }
495 add_action( 'admin_enqueue_scripts', 'idea_push_register_admin_styles_single' );
496
497
498
499
500
501
502
503
504
505
506
507
508
509 // Load frontend style and scripts
510 function idea_push_register_frontend_styles()
511 {
512 //get settings
513 $options = get_option('idea_push_settings');
514
515 //css
516 wp_enqueue_style( 'custom-frontend-style-ideapush', plugins_url( '/inc/css/frontendstyle.css', __FILE__ ),array(),'1.22.0');
517 wp_enqueue_style( 'font-awesome', plugins_url( '/inc/css/font-awesome.min.css', __FILE__ ));
518
519
520 //js
521 wp_register_script( 'custom-frontend-script-ideapush', plugins_url( '/inc/js/frontendscript.js', __FILE__ ), array( 'jquery'), '1.22.0');
522
523 wp_localize_script('custom-frontend-script-ideapush','get_new_ideas', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
524 wp_localize_script('custom-frontend-script-ideapush','is_person_logged_in', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
525 wp_localize_script('custom-frontend-script-ideapush','submit_vote', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
526 wp_localize_script('custom-frontend-script-ideapush','create_user', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
527 wp_localize_script('custom-frontend-script-ideapush','header_render', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
528 wp_localize_script('custom-frontend-script-ideapush','form_render', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
529 wp_localize_script('custom-frontend-script-ideapush','create_idea', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
530 wp_localize_script('custom-frontend-script-ideapush','delete_idea', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
531 wp_localize_script('custom-frontend-script-ideapush','change_status', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
532 wp_localize_script('custom-frontend-script-ideapush','update_vote_counter', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
533 wp_localize_script('custom-frontend-script-ideapush','below_title_header', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
534 wp_localize_script('custom-frontend-script-ideapush','is_person_able_to_add_tag', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
535
536
537
538 wp_enqueue_script(array('custom-frontend-script-ideapush'));
539 wp_enqueue_script('scroll-reveal', plugins_url('/inc/js/scrollreveal.min.js', __FILE__ ), array( 'jquery'));
540 wp_enqueue_script('read-more', plugins_url('/inc/js/readmore.min.js', __FILE__ ), array( 'jquery'));
541 wp_enqueue_script('jquery-ui-dialog');
542
543
544 if(strlen($options['idea_push_recaptcha_site_key']) > 0){
545 wp_enqueue_script('google-recaptcha', 'https://www.google.com/recaptcha/api.js');
546 }
547
548
549
550 }
551 add_action( 'wp_enqueue_scripts', 'idea_push_register_frontend_styles' );
552
553
554
555
556
557
558
559
560
561 //create taxonomy item
562 //this is used to create a taxonomy for the board when the user creates a board from the plugin settings
563 function idea_push_add_taxonomy_item() {
564
565 //get options
566 $options = get_option('idea_push_settings');
567
568 //get is pro
569 global $ideapush_is_pro;
570
571 //get board name from ajax call
572 $boardName = idea_push_sanitization_validation($_POST['boardName'],'boardname');
573
574 if($boardName == false){
575 wp_die();
576 }
577
578
579
580
581 //lets first check if the board already exists
582 if(get_term_by('name', $boardName, 'boards') == false){
583
584 //lets check if licenced
585 if(($ideapush_is_pro == 'YES' && strlen($options['idea_push_purchase_email'])>0 && strlen($options['idea_push_order_id'])>0) || wp_count_terms('boards',array( "hide_empty" => 0 )) == 0){
586
587 $boardNameSlug = strtolower($boardName);
588 $boardNameSlug = preg_replace('/\s+/', '-', $boardNameSlug);
589
590 wp_insert_term(
591 $boardName, // the term
592 'boards', // the taxonomy
593 array(
594 'description'=> '',
595 'slug' => $boardNameSlug
596 )
597 );
598
599 //lets return the item id
600
601 $getTermId = get_term_by('name', $boardName, 'boards');
602 $termId = $getTermId->term_id;
603
604 echo $termId;
605
606
607 } else {
608 echo 'NOT-PRO';
609 }
610
611
612
613
614 } else {
615
616 echo 'TERM-EXISTS';
617
618
619 }
620
621 //die
622 wp_die();
623
624
625 }
626 add_action( 'wp_ajax_add_taxonomy_item', 'idea_push_add_taxonomy_item' );
627
628
629
630
631
632
633
634
635
636 //lets delete existing taxonomies and rename others where necessary
637 function idea_push_taxonomy_save_routine() {
638
639
640 //get board name from ajax call
641 $comparisonData = $_POST['comparisonData'];
642 $explodeTheData = explode("||", $comparisonData);
643
644 $boardIdArray = array();
645
646 foreach($explodeTheData as $board){
647
648 $anotherExplosion = explode("|", $board);
649 $boardId = $anotherExplosion[0];
650 $boardName = $anotherExplosion[1];
651
652 array_push($boardIdArray,$boardId);
653
654 //now lets change the name of existing taxonomies
655 $termObject = get_term($boardId,'boards');
656
657 //if the there's a match lets update the name if it has changed
658 if(!is_wp_error($termObject)){
659
660 $termName = $termObject->name;
661
662 if($boardName !== $termName){
663 //they don't match so lets update this term name with the new board name
664 wp_update_term($boardId,'boards',array('name' => $boardName));
665 }
666 }
667
668 }
669
670
671 //lets cycle through the existing terms in the taxonomy
672 $existingTerms = get_terms('boards',array( "hide_empty" => 0 ));
673
674 foreach($existingTerms as $term){
675
676 $termId = $term->term_id;
677
678 if(!in_array($termId,$boardIdArray)){
679 //if the term is not in our array delete it because it's not authorised to exist and it will cause confusion
680 wp_delete_term($termId,'boards');
681
682 }
683 }
684
685
686 //die
687 wp_die();
688
689
690 }
691 add_action( 'wp_ajax_taxonomy_save_routine', 'idea_push_taxonomy_save_routine' );
692
693
694
695
696
697
698
699
700 //add additional body class to the shortcode page for good measure
701 function idea_push_add_body_class($class) {
702
703 global $post;
704
705 if( isset($post->post_content) && has_shortcode( $post->post_content, 'ideapush' ) ) {
706 $class[] = 'idea-push';
707 }
708 return $class;
709 }
710 add_filter( 'body_class', 'idea_push_add_body_class' );
711
712
713
714 //add notification icon to menu item
715
716 add_action( 'admin_menu', 'idea_push_menu_bubble' );
717
718 function idea_push_menu_bubble() {
719 global $menu;
720
721 $count = idea_push_count_pending_ideas() + idea_push_count_ideas_review_status();
722
723
724 if ($count > 0) {
725
726 foreach ( $menu as $key => $value ) {
727
728 if ( $menu[$key][2] == 'edit.php?post_type=idea' ) {
729
730 $menu[$key][0] .= ' <span class="update-plugins"><span class="plugin-count">' . $count . '</span></span>';
731
732 return;
733 }
734 }
735 }
736 }
737
738
739 function idea_push_above_all_ideas_table() {
740
741 $screen = get_current_screen();
742
743 if ( $screen->id == 'edit-idea' ) {
744
745 echo '<style>
746
747 .idea-tasks div {
748 display: inline-block;
749 background: #fff;
750 padding: 10px;
751 border: 1px solid #e5e5e5;
752 border-radius: 6px;
753 margin-right: 10px;
754 margin-top: 10px;
755 margin-bottom: -10px;
756
757 }
758
759 .idea-tasks a {
760 text-decoration: none;
761
762 }
763
764 .pending-count, .reviewed-count {
765 display: inline-block;
766 vertical-align: top;
767 margin: 1px 0 0 5px;
768 padding: 0 5px;
769 min-width: 7px;
770 height: 17px;
771 border-radius: 11px;
772 background-color: #ca4a1f;
773 color: #fff;
774 font-size: 9px;
775 line-height: 17px;
776 text-align: center;
777 z-index: 26;
778
779 }
780
781 .column-status .open {
782 background-color: #4eb5e1;
783 color: #fff !important;
784 }
785
786 .column-status .in-progress {
787 background-color: #a7a9ac;
788 color: #fff !important;
789 }
790
791
792 .column-status .completed {
793 background-color: #414042;
794 color: #fff !important;
795 }
796
797 .column-status .reviewed {
798 background-color: #fbbf67;
799 color: #fff !important;
800 }
801
802 .column-status .approved {
803 background-color: #5eb46a;
804 color: #fff !important;
805 }
806
807 .column-status .declined {
808 background-color: #f05d55;
809 color: #fff !important;
810 }
811
812
813 .column-status a {
814
815 text-transform: uppercase;
816 padding: 3px 6px;
817 border-radius: 3px;
818 font-weight: 600;
819 font-size: smaller;
820 }
821
822 </style>';
823
824 $pendingEditPage = get_admin_url().'edit.php?post_status=pending&post_type=idea';
825 $reviewEditPage = get_admin_url().'edit.php?post_type=idea&status=reviewed';
826
827 $countPendingIdeas = idea_push_count_pending_ideas();
828 $countReviewStatus = idea_push_count_ideas_review_status();
829
830
831 echo '<div class="idea-tasks">';
832
833 if($countPendingIdeas > 0){
834 echo '<div class="pending-approval">';
835 echo '<a href="'.$pendingEditPage.'" class="pending-count-description">'.__( 'Ideas Pending Release', 'ideapush' ).'</a>';
836 echo '<span class="pending-count">'.$countPendingIdeas.'</span>';
837 echo '</div>';
838 }
839
840 if($countReviewStatus > 0){
841 echo '<div class="reviewed-status">';
842 echo '<a href="'.$reviewEditPage.'" class="reviewed-count-description">'.__( 'Ideas Needing Review', 'ideapush' ).'</a>';
843 echo '<span class="reviewed-count">'.$countReviewStatus.'</span>';
844 echo '</div>';
845 }
846
847 echo '</div>';
848
849
850 }
851
852
853 }
854 add_action( 'admin_notices', 'idea_push_above_all_ideas_table' );
855
856
857
858
859
860 add_filter( 'manage_edit-idea_columns', 'mycustomposttype_columns_definition' ) ;
861
862
863 function mycustomposttype_columns_definition( $columns ) {
864
865 $new = array();
866
867 $columns['votes'] = __( 'Votes','ideapush');
868 unset( $new['taxonomy-status'] );
869 $columns['status'] = __( 'Status','ideapush');
870
871 $customOrder = array('cb','title', 'author','taxonomy-boards' ,'status','taxonomy-tags','votes', 'comments','date');
872
873
874 foreach ($customOrder as $colname)
875 $new[$colname] = $columns[$colname];
876 return $new;
877 }
878
879
880
881
882 add_action( 'manage_idea_posts_custom_column' , 'idea_push_vote_column_content', 10, 2 );
883
884 function idea_push_vote_column_content( $column, $post_id ) {
885 switch ( $column ) {
886
887 // display a thumbnail photo
888 case 'votes' :
889 echo get_post_meta( $post_id , 'votes' , true );
890 break;
891 case 'status' :
892 $getTerms = get_the_terms( $post_id, 'status' );
893
894 foreach($getTerms as $term) {
895 $status = $term->name;
896 }
897
898 $className = strtolower($status);
899 $className = str_replace(" ","-",$className);
900
901 echo '<a class="'.$className.'" href="'.get_admin_url().'edit.php?post_type=idea&status='.$className.'">'.$status.'</a>';
902 break;
903
904 }
905 }
906
907
908 add_filter( 'manage_edit-idea_sortable_columns', 'idea_push_sortable_vote_column' );
909
910 function idea_push_sortable_vote_column( $columns ) {
911 $columns['votes'] = 'votes';
912 return $columns;
913 }
914
915
916 add_action( 'pre_get_posts', 'idea_push_custom_orderby' );
917
918 function idea_push_custom_orderby( $query ) {
919 if ( ! is_admin() )
920 return;
921
922 $orderby = $query->get( 'orderby');
923
924 if ( 'votes' == $orderby ) {
925 $query->set( 'meta_key', 'votes' );
926 $query->set( 'orderby', 'meta_value_num' );
927 }
928
929 }
930
931
932
933
934 add_filter( 'template_include', 'idea_push_ip_tag_template', 99 );
935
936 function idea_push_ip_tag_template( $template ) {
937
938
939
940 if ( is_tax( 'tags' )) {
941 $template = dirname( __FILE__ ) . '/inc/templates/ip-tag.php';
942 return $template;
943 } else {
944 return $template;
945 }
946
947 }
948
949
950 function idea_push_languages() {
951 load_plugin_textdomain( 'ideapush', false, 'ideapush/inc/languages' );
952 }
953 add_action('init', 'idea_push_languages');
954
955
956
957
958
959
960 add_action( 'pre_get_posts', function ( $query ) {
961
962 //get options
963 $options = get_option('idea_push_settings');
964
965 //get board configuration
966 $boardConfiguration = $options['idea_push_board_configuration'];
967
968 //split board configuration
969 $splitBoardConfiguration = explode('||',$boardConfiguration);
970
971 $boardsToHide = array();
972
973 //cycle through boards
974 foreach($splitBoardConfiguration as $boardConfig){
975
976 if(!empty($boardConfig)){
977
978 $furtherSplitBoardConfiguration = explode('|',$boardConfig);
979
980 if($furtherSplitBoardConfiguration[13] == 'Yes'){
981
982 $term = get_term($furtherSplitBoardConfiguration[0], 'boards' );
983 $slug = $term->slug;
984
985 array_push($boardsToHide,$slug);
986 }
987 }
988
989 }
990
991
992 global $wp_the_query;
993 if($query === $wp_the_query && $query->is_search() && !is_admin()) {
994 $tax_query = array(
995 array(
996 'taxonomy' => 'boards',
997 'field' => 'slug',
998 'terms' => $boardsToHide,
999 'operator' => 'NOT IN',
1000 )
1001 );
1002 $query->set( 'tax_query', $tax_query );
1003 }
1004
1005
1006 });
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020 //add custom css to the frontend
1021 function idea_push_custom_css() {
1022
1023 //get options
1024 $options = get_option('idea_push_settings');
1025
1026
1027 if(isset($options['idea_push_custom_css']) && strlen($options['idea_push_custom_css'])>0){
1028
1029 wp_enqueue_style( 'custom-frontend-style', plugins_url( '/inc/css/frontendstyle.css', __FILE__ ) );
1030 wp_add_inline_style( 'custom-frontend-style', $options['idea_push_custom_css'] );
1031
1032 }
1033
1034 }
1035 add_action( 'wp_enqueue_scripts', 'idea_push_custom_css', 999 );
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053 //do pro updates
1054 //initialise the update check
1055 if($ideapush_is_pro == 'YES'){
1056
1057 require 'inc/pro-ip/plugin-update-checker/plugin-update-checker.php';
1058 $updateChecker = Puc_v4_Factory::buildUpdateChecker(
1059 'https://northernbeacheswebsites.com.au/?update_action=get_metadata&update_slug=ideapush', //Metadata URL.
1060 __FILE__, //Full path to the main plugin file.
1061 'ideapush' //Plugin slug. Usually it's the same as the name of the directory.
1062 );
1063
1064
1065 //add queries to the update call
1066 $updateChecker->addQueryArgFilter('filter_update_checks_ideapush');
1067 function filter_update_checks_ideapush($queryArgs) {
1068
1069
1070 $pluginSettings = get_option('idea_push_settings');
1071
1072 if(isset($pluginSettings['idea_push_purchase_email']) && isset($pluginSettings['idea_push_order_id'])){
1073
1074 $purchaseEmailAddress = $pluginSettings['idea_push_purchase_email'];
1075 $orderId = $pluginSettings['idea_push_order_id'];
1076 $siteUrl = get_site_url();
1077
1078 if (!empty($purchaseEmailAddress) && !empty($orderId)) {
1079 $queryArgs['purchaseEmailAddress'] = $purchaseEmailAddress;
1080 $queryArgs['orderId'] = $orderId;
1081 $queryArgs['siteUrl'] = $siteUrl;
1082 $queryArgs['productId'] = '9719';
1083 }
1084
1085 }
1086
1087 return $queryArgs;
1088 }
1089
1090
1091
1092 // define the puc_request_info_result-<slug> callback
1093 function filter_puc_request_info_result_slug_ideapush( $plugininfo, $result ) {
1094 //get the message from the server and set as transient
1095 set_transient('ideapush-update',$plugininfo->{'message'},YEAR_IN_SECONDS * 1);
1096
1097 return $plugininfo;
1098 };
1099 add_filter( "puc_request_info_result-ideapush", 'filter_puc_request_info_result_slug_ideapush', 10, 2 );
1100
1101
1102
1103
1104
1105
1106 $path = plugin_basename( __FILE__ );
1107
1108 add_action("after_plugin_row_{$path}", function( $plugin_file, $plugin_data, $status ) {
1109
1110 //get plugin settings
1111 $pluginSettings = get_option('idea_push_settings');
1112
1113
1114 if (!empty($pluginSettings['idea_push_purchase_email']) && !empty($pluginSettings['idea_push_order_id'])) {
1115
1116
1117
1118 //get transient
1119 $message = get_transient('ideapush-update');
1120
1121 if($message !== 'Yes'){
1122
1123 $purchaseLink = 'https://northernbeacheswebsites.com.au/ideapush-pro/';
1124
1125 if($message == 'Incorrect Details'){
1126 $displayMessage = 'The Order ID and Purchase ID you entered is not correct. Please double check the details you entered to receive product updates.';
1127 } elseif ($message == 'Licence Expired'){
1128 $displayMessage = 'Your licence has expired. Please <a href="'.$purchaseLink.'" target="_blank">purchase a new licence</a> to receive further updates for this plugin.';
1129 } elseif ($message == 'Website Mismatch') {
1130 $displayMessage = 'This plugin has already been registered on another website using your details. Under the licence terms this plugin can only be used on one website. Please <a href="'.$purchaseLink.'" target="_blank">click here</a> to purchase an additional licence.';
1131 } else {
1132 $displayMessage = '';
1133 }
1134
1135 echo '<tr class="plugin-update-tr active"><td colspan="3" class="plugin-update colspanchange"><div class="update-message notice inline notice-error notice-alt"><p class="installer-q-icon">'.$displayMessage.'</p></div></td></tr>';
1136
1137 }
1138
1139 } else {
1140
1141 echo '<tr class="plugin-update-tr active"><td colspan="3" class="plugin-update colspanchange"><div class="update-message notice inline notice-error notice-alt"><p class="installer-q-icon">Please enter your Order ID and Purchase ID in the plugin settings to receive automatics updates.</p></div></td></tr>';
1142
1143 }
1144
1145
1146 }, 10, 3 );
1147
1148
1149 }
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161 ?>