PluginProbe
IdeaPush / 1.27
IdeaPush v1.27
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.27, at ideapush.php

1,163 lines 34.4 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.27
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 that updates a user
401 require('inc/functions/update-user.php');
402
403 //function puts idea stuff on the single idea page
404 require('inc/functions/single-idea.php');
405
406 //function that adds our metabox
407 require('inc/functions/create-metaboxes.php');
408
409 //function that creates user profile image
410 require('inc/functions/user-profile-image.php');
411
412
413
414 //get pro options
415 if($ideapush_is_pro=="YES"){
416 require('inc/pro-ip/idea-push-pro.php');
417 }
418
419
420
421
422 function test(){
423
424 $current = get_current_screen();
425 print_r($current);
426 }
427 add_action('admin_init','test');
428
429
430
431
432 // Load admin style and scripts
433 function idea_push_register_admin_styles($hook)
434 {
435
436
437 global $pagenow;
438
439 global $idea_push_wp_settings_page;
440 global $idea_push_wp_reports_page;
441
442 if('profile.php' == $pagenow){
443 //display on user profile page
444 wp_enqueue_media();
445 wp_enqueue_script( 'user-profile-script-ideapush', plugins_url( '/inc/js/userprofile.js', __FILE__ ), array( 'jquery' ));
446 }
447
448
449 if($hook != $idea_push_wp_reports_page && $hook != $idea_push_wp_settings_page ){
450 return;
451
452 } else {
453 //css
454 wp_enqueue_style( 'wp-color-picker' );
455 wp_enqueue_style( 'custom-admin-style-ideapush', plugins_url( '/inc/css/adminstyle.css', __FILE__ ));
456 wp_enqueue_style( 'font-awesome', plugins_url( '/inc/css/font-awesome.min.css', __FILE__ ));
457
458 //js
459 wp_enqueue_script( 'custom-admin-script-ideapush', plugins_url( '/inc/js/adminscript.js', __FILE__ ), array( 'jquery','wp-color-picker' ));
460 wp_enqueue_script('jquery-ui-dialog');
461 wp_enqueue_script('jquery-ui-accordion');
462 wp_enqueue_script('jquery-ui-tabs');
463 wp_enqueue_script('jquery-ui-datepicker');
464 wp_enqueue_script('jquery-form');
465
466
467 wp_enqueue_script('clipboard', plugins_url('/inc/js/clipboard.min.js', __FILE__ ), array( 'jquery'));
468
469 }
470
471
472
473
474
475
476
477
478 }
479 add_action( 'admin_enqueue_scripts', 'idea_push_register_admin_styles' );
480
481
482
483 // Load styles and scripts for the single idea page
484 function idea_push_register_admin_styles_single()
485 {
486
487 global $post_type;
488
489 if('idea' != $post_type)
490 return;
491
492 //css
493
494 //js
495 wp_enqueue_script( 'custom-frontend-script-single-idea', plugins_url( '/inc/js/singleideascript.js', __FILE__ ), array( 'jquery'), '1.0.0');
496
497 }
498 add_action( 'admin_enqueue_scripts', 'idea_push_register_admin_styles_single' );
499
500
501
502
503
504
505
506
507
508
509
510
511
512 // Load frontend style and scripts
513 function idea_push_register_frontend_styles()
514 {
515 //get settings
516 $options = get_option('idea_push_settings');
517
518 //css
519 wp_enqueue_style( 'custom-frontend-style-ideapush', plugins_url( '/inc/css/frontendstyle.css', __FILE__ ),array(),idea_push_plugin_get_version());
520 wp_enqueue_style( 'font-awesome', plugins_url( '/inc/css/font-awesome.min.css', __FILE__ ));
521
522
523 //js
524 wp_register_script( 'custom-frontend-script-ideapush', plugins_url( '/inc/js/frontendscript.js', __FILE__ ), array( 'jquery'), idea_push_plugin_get_version());
525
526 wp_localize_script('custom-frontend-script-ideapush','get_new_ideas', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
527 wp_localize_script('custom-frontend-script-ideapush','is_person_logged_in', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
528 wp_localize_script('custom-frontend-script-ideapush','submit_vote', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
529 wp_localize_script('custom-frontend-script-ideapush','create_user', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
530 wp_localize_script('custom-frontend-script-ideapush','header_render', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
531 wp_localize_script('custom-frontend-script-ideapush','form_render', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
532 wp_localize_script('custom-frontend-script-ideapush','create_idea', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
533 wp_localize_script('custom-frontend-script-ideapush','delete_idea', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
534 wp_localize_script('custom-frontend-script-ideapush','change_status', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
535 wp_localize_script('custom-frontend-script-ideapush','update_vote_counter', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
536 wp_localize_script('custom-frontend-script-ideapush','below_title_header', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
537 wp_localize_script('custom-frontend-script-ideapush','is_person_able_to_add_tag', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
538 wp_localize_script('custom-frontend-script-ideapush','update_user_profile', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
539
540
541
542 wp_enqueue_script(array('custom-frontend-script-ideapush'));
543 wp_enqueue_script('scroll-reveal', plugins_url('/inc/js/scrollreveal.min.js', __FILE__ ), array( 'jquery'));
544 wp_enqueue_script('read-more', plugins_url('/inc/js/readmore.min.js', __FILE__ ), array( 'jquery'));
545 wp_enqueue_script('jquery-ui-dialog');
546
547
548 // if(strlen($options['idea_push_recaptcha_site_key']) > 0){
549 // wp_enqueue_script('google-recaptcha', 'https://www.google.com/recaptcha/api.js');
550 // }
551
552
553
554 }
555 add_action( 'wp_enqueue_scripts', 'idea_push_register_frontend_styles' );
556
557
558
559
560
561
562
563 //create taxonomy item
564 //this is used to create a taxonomy for the board when the user creates a board from the plugin settings
565 function idea_push_add_taxonomy_item() {
566
567 //get options
568 $options = get_option('idea_push_settings');
569
570 //get is pro
571 global $ideapush_is_pro;
572
573 //get board name from ajax call
574 $boardName = idea_push_sanitization_validation($_POST['boardName'],'boardname');
575
576 if($boardName == false){
577 wp_die();
578 }
579
580
581
582
583 //lets first check if the board already exists
584 if(get_term_by('name', $boardName, 'boards') == false){
585
586 //lets check if licenced
587 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){
588
589 $boardNameSlug = strtolower($boardName);
590 $boardNameSlug = preg_replace('/\s+/', '-', $boardNameSlug);
591
592 wp_insert_term(
593 $boardName, // the term
594 'boards', // the taxonomy
595 array(
596 'description'=> '',
597 'slug' => $boardNameSlug
598 )
599 );
600
601 //lets return the item id
602
603 $getTermId = get_term_by('name', $boardName, 'boards');
604 $termId = $getTermId->term_id;
605
606 echo $termId;
607
608
609 } else {
610 echo 'NOT-PRO';
611 }
612
613
614
615
616 } else {
617
618 echo 'TERM-EXISTS';
619
620
621 }
622
623 //die
624 wp_die();
625
626
627 }
628 add_action( 'wp_ajax_add_taxonomy_item', 'idea_push_add_taxonomy_item' );
629
630
631
632
633
634
635
636
637
638 //lets delete existing taxonomies and rename others where necessary
639 function idea_push_taxonomy_save_routine() {
640
641
642 //get board name from ajax call
643 $comparisonData = $_POST['comparisonData'];
644 $explodeTheData = explode("||", $comparisonData);
645
646 $boardIdArray = array();
647
648 foreach($explodeTheData as $board){
649
650 $anotherExplosion = explode("|", $board);
651 $boardId = $anotherExplosion[0];
652 $boardName = $anotherExplosion[1];
653
654 array_push($boardIdArray,$boardId);
655
656 //now lets change the name of existing taxonomies
657 $termObject = get_term($boardId,'boards');
658
659 //if the there's a match lets update the name if it has changed
660 if(!is_wp_error($termObject)){
661
662 $termName = $termObject->name;
663
664 if($boardName !== $termName){
665 //they don't match so lets update this term name with the new board name
666 wp_update_term($boardId,'boards',array('name' => $boardName));
667 }
668 }
669
670 }
671
672
673 //lets cycle through the existing terms in the taxonomy
674 $existingTerms = get_terms('boards',array( "hide_empty" => 0 ));
675
676 foreach($existingTerms as $term){
677
678 $termId = $term->term_id;
679
680 if(!in_array($termId,$boardIdArray)){
681 //if the term is not in our array delete it because it's not authorised to exist and it will cause confusion
682 wp_delete_term($termId,'boards');
683
684 }
685 }
686
687
688 //die
689 wp_die();
690
691
692 }
693 add_action( 'wp_ajax_taxonomy_save_routine', 'idea_push_taxonomy_save_routine' );
694
695
696
697
698
699
700
701
702 //add additional body class to the shortcode page for good measure
703 function idea_push_add_body_class($class) {
704
705 global $post;
706
707 if( isset($post->post_content) && has_shortcode( $post->post_content, 'ideapush' ) ) {
708 $class[] = 'idea-push';
709 }
710 return $class;
711 }
712 add_filter( 'body_class', 'idea_push_add_body_class' );
713
714
715
716 //add notification icon to menu item
717
718 add_action( 'admin_menu', 'idea_push_menu_bubble' );
719
720 function idea_push_menu_bubble() {
721 global $menu;
722
723 $count = idea_push_count_pending_ideas() + idea_push_count_ideas_review_status();
724
725
726 if ($count > 0) {
727
728 foreach ( $menu as $key => $value ) {
729
730 if ( $menu[$key][2] == 'edit.php?post_type=idea' ) {
731
732 $menu[$key][0] .= ' <span class="update-plugins"><span class="plugin-count">' . $count . '</span></span>';
733
734 return;
735 }
736 }
737 }
738 }
739
740
741 function idea_push_above_all_ideas_table() {
742
743 $screen = get_current_screen();
744
745 if ( $screen->id == 'edit-idea' ) {
746
747 echo '<style>
748
749 .idea-tasks div {
750 display: inline-block;
751 background: #fff;
752 padding: 10px;
753 border: 1px solid #e5e5e5;
754 border-radius: 6px;
755 margin-right: 10px;
756 margin-top: 10px;
757 margin-bottom: -10px;
758
759 }
760
761 .idea-tasks a {
762 text-decoration: none;
763
764 }
765
766 .pending-count, .reviewed-count {
767 display: inline-block;
768 vertical-align: top;
769 margin: 1px 0 0 5px;
770 padding: 0 5px;
771 min-width: 7px;
772 height: 17px;
773 border-radius: 11px;
774 background-color: #ca4a1f;
775 color: #fff;
776 font-size: 9px;
777 line-height: 17px;
778 text-align: center;
779 z-index: 26;
780
781 }
782
783 .column-status .open {
784 background-color: #4eb5e1;
785 color: #fff !important;
786 }
787
788 .column-status .in-progress {
789 background-color: #a7a9ac;
790 color: #fff !important;
791 }
792
793
794 .column-status .completed {
795 background-color: #414042;
796 color: #fff !important;
797 }
798
799 .column-status .reviewed {
800 background-color: #fbbf67;
801 color: #fff !important;
802 }
803
804 .column-status .approved {
805 background-color: #5eb46a;
806 color: #fff !important;
807 }
808
809 .column-status .declined {
810 background-color: #f05d55;
811 color: #fff !important;
812 }
813
814
815 .column-status a {
816
817 text-transform: uppercase;
818 padding: 3px 6px;
819 border-radius: 3px;
820 font-weight: 600;
821 font-size: smaller;
822 }
823
824 </style>';
825
826 $pendingEditPage = get_admin_url().'edit.php?post_status=pending&post_type=idea';
827 $reviewEditPage = get_admin_url().'edit.php?post_type=idea&status=reviewed';
828
829 $countPendingIdeas = idea_push_count_pending_ideas();
830 $countReviewStatus = idea_push_count_ideas_review_status();
831
832
833 echo '<div class="idea-tasks">';
834
835 if($countPendingIdeas > 0){
836 echo '<div class="pending-approval">';
837 echo '<a href="'.$pendingEditPage.'" class="pending-count-description">'.__( 'Ideas Pending Release', 'ideapush' ).'</a>';
838 echo '<span class="pending-count">'.$countPendingIdeas.'</span>';
839 echo '</div>';
840 }
841
842 if($countReviewStatus > 0){
843 echo '<div class="reviewed-status">';
844 echo '<a href="'.$reviewEditPage.'" class="reviewed-count-description">'.__( 'Ideas Needing Review', 'ideapush' ).'</a>';
845 echo '<span class="reviewed-count">'.$countReviewStatus.'</span>';
846 echo '</div>';
847 }
848
849 echo '</div>';
850
851
852 }
853
854
855 }
856 add_action( 'admin_notices', 'idea_push_above_all_ideas_table' );
857
858
859
860
861
862 add_filter( 'manage_edit-idea_columns', 'mycustomposttype_columns_definition' ) ;
863
864
865 function mycustomposttype_columns_definition( $columns ) {
866
867 $new = array();
868
869 $columns['votes'] = __( 'Votes','ideapush');
870 unset( $new['taxonomy-status'] );
871 $columns['status'] = __( 'Status','ideapush');
872
873 $customOrder = array('cb','title', 'author','taxonomy-boards' ,'status','taxonomy-tags','votes', 'comments','date');
874
875
876 foreach ($customOrder as $colname)
877 $new[$colname] = $columns[$colname];
878 return $new;
879 }
880
881
882
883
884 add_action( 'manage_idea_posts_custom_column' , 'idea_push_vote_column_content', 10, 2 );
885
886 function idea_push_vote_column_content( $column, $post_id ) {
887 switch ( $column ) {
888
889 // display a thumbnail photo
890 case 'votes' :
891 echo get_post_meta( $post_id , 'votes' , true );
892 break;
893 case 'status' :
894 $getTerms = get_the_terms( $post_id, 'status' );
895
896 foreach($getTerms as $term) {
897 $status = $term->name;
898 }
899
900 $className = strtolower($status);
901 $className = str_replace(" ","-",$className);
902
903 echo '<a class="'.$className.'" href="'.get_admin_url().'edit.php?post_type=idea&status='.$className.'">'.$status.'</a>';
904 break;
905
906 }
907 }
908
909
910 add_filter( 'manage_edit-idea_sortable_columns', 'idea_push_sortable_vote_column' );
911
912 function idea_push_sortable_vote_column( $columns ) {
913 $columns['votes'] = 'votes';
914 return $columns;
915 }
916
917
918 add_action( 'pre_get_posts', 'idea_push_custom_orderby' );
919
920 function idea_push_custom_orderby( $query ) {
921 if ( ! is_admin() )
922 return;
923
924 $orderby = $query->get( 'orderby');
925
926 if ( 'votes' == $orderby ) {
927 $query->set( 'meta_key', 'votes' );
928 $query->set( 'orderby', 'meta_value_num' );
929 }
930
931 }
932
933
934
935
936 add_filter( 'template_include', 'idea_push_ip_tag_template', 99 );
937
938 function idea_push_ip_tag_template( $template ) {
939
940
941
942 if ( is_tax( 'tags' )) {
943 $template = dirname( __FILE__ ) . '/inc/templates/ip-tag.php';
944 return $template;
945 } else {
946 return $template;
947 }
948
949 }
950
951
952 function idea_push_languages() {
953 load_plugin_textdomain( 'ideapush', false, 'ideapush/inc/languages' );
954 }
955 add_action('init', 'idea_push_languages');
956
957
958
959
960
961
962 add_action( 'pre_get_posts', function ( $query ) {
963
964 //get options
965 $options = get_option('idea_push_settings');
966
967 //get board configuration
968 $boardConfiguration = $options['idea_push_board_configuration'];
969
970 //split board configuration
971 $splitBoardConfiguration = explode('||',$boardConfiguration);
972
973 $boardsToHide = array();
974
975 //cycle through boards
976 foreach($splitBoardConfiguration as $boardConfig){
977
978 if(!empty($boardConfig)){
979
980 $furtherSplitBoardConfiguration = explode('|',$boardConfig);
981
982 if($furtherSplitBoardConfiguration[13] == 'Yes'){
983
984 $term = get_term($furtherSplitBoardConfiguration[0], 'boards' );
985 $slug = $term->slug;
986
987 array_push($boardsToHide,$slug);
988 }
989 }
990
991 }
992
993
994 global $wp_the_query;
995 if($query === $wp_the_query && $query->is_search() && !is_admin()) {
996 $tax_query = array(
997 array(
998 'taxonomy' => 'boards',
999 'field' => 'slug',
1000 'terms' => $boardsToHide,
1001 'operator' => 'NOT IN',
1002 )
1003 );
1004 $query->set( 'tax_query', $tax_query );
1005 }
1006
1007
1008 });
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022 //add custom css to the frontend
1023 function idea_push_custom_css() {
1024
1025 //get options
1026 $options = get_option('idea_push_settings');
1027
1028
1029 if(isset($options['idea_push_custom_css']) && strlen($options['idea_push_custom_css'])>0){
1030
1031 wp_enqueue_style( 'custom-frontend-style', plugins_url( '/inc/css/frontendstyle.css', __FILE__ ) );
1032 wp_add_inline_style( 'custom-frontend-style', $options['idea_push_custom_css'] );
1033
1034 }
1035
1036 }
1037 add_action( 'wp_enqueue_scripts', 'idea_push_custom_css', 999 );
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055 //do pro updates
1056 //initialise the update check
1057 if($ideapush_is_pro == 'YES'){
1058
1059 require 'inc/pro-ip/plugin-update-checker/plugin-update-checker.php';
1060 $updateChecker = Puc_v4_Factory::buildUpdateChecker(
1061 'https://northernbeacheswebsites.com.au/?update_action=get_metadata&update_slug=ideapush', //Metadata URL.
1062 __FILE__, //Full path to the main plugin file.
1063 'ideapush' //Plugin slug. Usually it's the same as the name of the directory.
1064 );
1065
1066
1067 //add queries to the update call
1068 $updateChecker->addQueryArgFilter('filter_update_checks_ideapush');
1069 function filter_update_checks_ideapush($queryArgs) {
1070
1071
1072 $pluginSettings = get_option('idea_push_settings');
1073
1074 if(isset($pluginSettings['idea_push_purchase_email']) && isset($pluginSettings['idea_push_order_id'])){
1075
1076 $purchaseEmailAddress = $pluginSettings['idea_push_purchase_email'];
1077 $orderId = $pluginSettings['idea_push_order_id'];
1078 $siteUrl = get_site_url();
1079
1080 if (!empty($purchaseEmailAddress) && !empty($orderId)) {
1081 $queryArgs['purchaseEmailAddress'] = $purchaseEmailAddress;
1082 $queryArgs['orderId'] = $orderId;
1083 $queryArgs['siteUrl'] = $siteUrl;
1084 $queryArgs['productId'] = '9719';
1085 }
1086
1087 }
1088
1089 return $queryArgs;
1090 }
1091
1092
1093
1094 // define the puc_request_info_result-<slug> callback
1095 function filter_puc_request_info_result_slug_ideapush( $plugininfo, $result ) {
1096 //get the message from the server and set as transient
1097 set_transient('ideapush-update',$plugininfo->{'message'},YEAR_IN_SECONDS * 1);
1098
1099 return $plugininfo;
1100 };
1101 add_filter( "puc_request_info_result-ideapush", 'filter_puc_request_info_result_slug_ideapush', 10, 2 );
1102
1103
1104
1105
1106
1107
1108 $path = plugin_basename( __FILE__ );
1109
1110 add_action("after_plugin_row_{$path}", function( $plugin_file, $plugin_data, $status ) {
1111
1112 //get plugin settings
1113 $pluginSettings = get_option('idea_push_settings');
1114
1115
1116 if (!empty($pluginSettings['idea_push_purchase_email']) && !empty($pluginSettings['idea_push_order_id'])) {
1117
1118
1119
1120 //get transient
1121 $message = get_transient('ideapush-update');
1122
1123 if($message !== 'Yes'){
1124
1125 $purchaseLink = 'https://northernbeacheswebsites.com.au/ideapush-pro/';
1126
1127 if($message == 'Incorrect Details'){
1128 $displayMessage = 'The Order ID and Purchase ID you entered is not correct. Please double check the details you entered to receive product updates.';
1129 } elseif ($message == 'Licence Expired'){
1130 $displayMessage = 'Your licence has expired. Please <a href="'.$purchaseLink.'" target="_blank">purchase a new licence</a> to receive further updates for this plugin.';
1131 } elseif ($message == 'Website Mismatch') {
1132 $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.';
1133 } else {
1134 $displayMessage = '';
1135 }
1136
1137 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>';
1138
1139 }
1140
1141 } else {
1142
1143 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>';
1144
1145 }
1146
1147
1148 }, 10, 3 );
1149
1150
1151 }
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163 ?>