/** * include_add_ons * Inlcude add-ons registered with piklist. * * @access public * @static * @since 1.0 */ public static function include_add_ons() { require_once ABSPATH . 'wp-admin/includes/plugin.php'; $site_wide_plugins = get_site_option('active_sitewide_plugins'); if (!empty($site_wide_plugins)) { $plugins = array_merge(get_option('active_plugins'), array_keys($site_wide_plugins)); } else { $plugins = get_option('active_plugins'); } foreach ($plugins as $plugin) { $path = WP_PLUGIN_DIR . '/' . $plugin; if (file_exists($path)) { $data = piklist::get_file_data($path, array('type' => 'Plugin Type', 'version' => 'Version')); if ($data['type'] && strtolower($data['type']) == 'piklist') { piklist::add_plugin(basename(dirname($plugin)), dirname($path)); add_action('load-plugins.php', array('piklist_admin', 'deactivation_link')); piklist_admin::$piklist_dependent = true; if ($data['version']) { $file = $plugin; $version = $data['version']; piklist_admin::check_update($file, $version); } } } } $addon_paths = piklist::paths(); $paths = array(); foreach ($addon_paths as $from => $path) { if ($from != 'theme') { array_push($paths, $path . '/add-ons'); if ($from != 'piklist') { array_push($paths, $path); } } } foreach ($paths as $path) { if (is_dir($path)) { if (strstr($path, 'add-ons')) { $add_ons = piklist::get_directory_list($path); foreach ($add_ons as $add_on) { $file = file_exists($path . '/' . $add_on . '/' . $add_on . '.php') ? $path . '/' . $add_on . '/' . $add_on . '.php' : $path . '/' . $add_on . '/plugin.php'; self::register_add_on($add_on, $file, $path); } } else { $add_on = basename($path); $file = file_exists($path . '/' . $add_on . '.php') ? $path . '/' . $add_on . '.php' : $path . '/plugin.php'; self::register_add_on($add_on, $file, $path, true); } } } do_action('piklist_activate_add_on'); }
public static function setup_theme() { if (is_dir(get_stylesheet_directory() . '/piklist')) { piklist::$paths['theme'] = get_stylesheet_directory() . '/piklist'; add_action('load-plugins.php', array('piklist_admin', 'deactivation_link')); piklist_admin::$piklist_dependent = true; } if (get_template_directory() != get_stylesheet_directory() && is_dir(get_template_directory() . '/piklist')) { piklist::$paths['parent-theme'] = get_template_directory() . '/piklist'; add_action('load-plugins.php', array('piklist_admin', 'deactivation_link')); piklist_admin::$piklist_dependent = true; } }
public static function register_settings() { piklist::process_views('settings', array('piklist_setting', 'register_settings_callback')); $default_tabs = piklist_admin::get('admin_page_default_tabs'); foreach (self::$settings as $setting => $sections) { add_filter('pre_update_option_' . $setting, array('piklist_setting', 'pre_update_option'), 10, 2); register_setting($setting, $setting); uasort($sections, array('piklist', 'sort_by_order')); self::$setting_tabs[$setting] = array('default' => array('title' => isset($default_tabs[$setting]) ? __($default_tabs[$setting]) : __('General', 'piklist'), 'page' => null, 'tab_order' => 10)); foreach ($sections as $section) { $tab = !empty($section['tab']) ? piklist::dashes($section['tab']) : 'default'; if (!isset(self::$setting_tabs[$setting][$tab]) && $tab) { self::$setting_tabs[$setting][$tab] = array('title' => $section['tab'], 'page' => $tab, 'tab_order' => $section['tab_order']); } elseif ($tab && !empty($section['tab_order']) && empty(self::$setting_tabs[$setting][$tab]['tab_order'])) { self::$setting_tabs[$setting][$tab]['tab_order'] = $section['tab_order']; } if (isset($_REQUEST['tab']) && isset($section['tab']) && $_REQUEST['tab'] == $tab || !isset($_REQUEST['tab']) && empty($section['tab'])) { self::$setting_section_callback_args[$section['slug']] = $section; add_settings_section($section['slug'], $section['title'], array('piklist_setting', 'register_settings_section_callback'), $setting); } } uasort(self::$setting_tabs[$setting], array('piklist', 'sort_by_tab_order')); } }
public static function admin_body_class($classes = '') { global $typenow; $classes .= $classes; if (piklist_admin::$piklist_dependent == true) { $classes .= 'piklist-dependent' . ' '; } if (piklist_admin::responsive_admin() == true) { $classes .= 'responsive-admin' . ' '; } if (isset($_GET['taxonomy'])) { $classes .= 'taxonomy-' . $_GET['taxonomy'] . ' '; } if ($typenow) { $classes .= 'post_type-' . $typenow; } return $classes; }
/** * is_allowed * Determines if a workflow tab is allowed to be shown. * * @param array $data The tab configuration object. * * @return array The statuse of whether its allowed. * * @access public * @static * @since 1.0 */ public static function is_allowed($data, $strict = true) { global $pagenow; $allowed = !$strict; // Check to see if there is an active flow if (isset($_REQUEST['flow']) && piklist::slug($flow, 'UTF-8') == $_REQUEST['flow']) { $allowed = true; } // Check Pages $pages = $data['data']['page']; if (!empty($pages)) { $allowed = in_array($pagenow, $pages); if (isset($_REQUEST['page'])) { $allowed = in_array($_REQUEST['page'], $pages); } } // Check Post Types if ($allowed && piklist_admin::is_post()) { $post_types = $data['data']['post_type']; $current_post_type = piklist_cpt::detect_post_type(); if (!empty($post_types)) { $allowed = in_array($current_post_type, $post_types); } } // Check which mode we are on for the term pages if (piklist_admin::is_term()) { $taxonomies = $data['data']['taxonomy']; $current_taxonomy = isset($_REQUEST['taxonomy']) ? $_REQUEST['taxonomy'] : false; if (!empty($taxonomies) && $current_taxonomy) { $allowed = in_array($current_taxonomy, $taxonomies); } if (piklist_admin::is_term() === 'new') { $allowed = false; } } return $allowed; }
enctype="multipart/form-data" id="<?php echo $id; ?> " autocomplete="off" data-piklist-form="true" class="piklist-form <?php echo is_admin() ? 'hidden' : null; ?> " > <?php do_action('piklist_notices', $id); foreach ($render as $form) { piklist::render($form, $data); } piklist('field', array('type' => 'hidden', 'scope' => piklist::$prefix, 'field' => 'form_id', 'value' => $id)); if ($data['filter']) { piklist('field', array('type' => 'hidden', 'scope' => piklist::$prefix, 'field' => 'filter', 'value' => 'true')); } if ($data['redirect']) { piklist('field', array('type' => 'hidden', 'scope' => piklist::$prefix, 'field' => 'redirect', 'value' => $data['redirect'])); } if (piklist_admin::hide_ui()) { piklist('field', array('type' => 'hidden', 'scope' => piklist::$prefix, 'field' => 'admin_hide_ui', 'value' => 'true')); } piklist_form::save_fields(); ?> </form>
<div class="wrap"> <?php if (isset($page_icon)) { ?> <?php piklist_admin::$page_icon = array('page_id' => '#icon-' . $section, 'icon_url' => $page_icon); ?> <?php $page_icon = $section; ?> <?php } elseif (isset($icon)) { ?> <?php $page_icon = $icon; ?> <?php } else { ?> <?php $page_icon = null; ?> <?php
/** * clear_screen * Clear the screen of all meta-boxes * * @access public * @static * @since 1.0 */ public static function clear_screen() { global $wp_meta_boxes, $current_screen; $workflow = piklist_workflow::get('workflow'); if ($workflow && $workflow['data']['clear'] == true && piklist_admin::is_post()) { remove_post_type_support('post', 'editor'); remove_post_type_support('post', 'title'); foreach (array('normal', 'advanced', 'side') as $context) { foreach (array('high', 'sorted', 'core', 'default', 'low') as $priority) { if (isset($wp_meta_boxes[$current_screen->id][$context][$priority])) { foreach ($wp_meta_boxes[$current_screen->id][$context][$priority] as $meta_box) { if ($meta_box['id'] != 'submitdiv') { unset($wp_meta_boxes[$current_screen->id][$context][$priority][$meta_box['id']]); } } } } } } }
public function ajax() { if (!isset($_REQUEST['method']) || !isset($_REQUEST['nonce']) || !wp_verify_nonce((string) $_REQUEST['nonce'], $this->slug)) { wp_send_json_error(); } global $wpdb; $output = array(); $method = esc_attr($_REQUEST['method']); switch ($method) { case 'complete-update': piklist_admin::$network_wide = is_plugin_active_for_network('piklist/piklist.php'); $updates = piklist_admin::$network_wide ? get_site_option('piklist_updates') : get_option('piklist_updates'); foreach ($updates['piklist'] as $index => $version) { if ($version == '0.9.9') { unset($updates['piklist'][$index]); } } $updates['piklist'] = array_values($updates['piklist']); piklist_admin::$network_wide ? update_site_option('piklist_updates', $updates) : update_option('piklist_updates', $updates); $output['message'] = 'Piklist Update 0.9.9 Completed!'; break; case 'options-update': /** * Fix arrays created by piklist_admin::check_update() * Remove null values and zero values */ $piklist_active_plugin_versions = piklist_admin::$network_wide ? get_site_option('piklist_active_plugin_versions') : get_option('piklist_active_plugin_versions'); foreach ($piklist_active_plugin_versions as $plugins => $versions) { foreach ($versions as $key => $value) { if (is_null($value) || $value == 0) { unset($piklist_active_plugin_versions[$plugins][$key]); } } } piklist_admin::$network_wide ? update_site_option('piklist_active_plugin_versions', $piklist_active_plugin_versions) : update_option('piklist_active_plugin_versions', $piklist_active_plugin_versions); $output['message'] = 'Active Plugin Versions Updated...'; break; case 'relate-update': $related = $wpdb->get_results("SELECT post_id, has_post_id FROM {$wpdb->prefix}post_relationships", ARRAY_A); $meta_key = '_' . piklist::$prefix . 'relate_post'; foreach ($related as $relate) { $current_related = get_metadata('post', $relate['post_id'], $meta_key); if (!$current_related || $current_related && !in_array($relate['has_post_id'], $current_related)) { add_metadata('post', $relate['post_id'], $meta_key, $relate['has_post_id']); add_metadata('post', $relate['has_post_id'], $meta_key, $relate['post_id']); } } $output['message'] = 'Post Relationships Updated...'; $relate_table = $wpdb->prefix . 'post_relationships'; $wpdb->query("DROP TABLE IF EXISTS {$relate_table}"); $output['message'] = 'Legacy post_relationships Table Deleted...'; break; case 'widgets': case 'settings': case 'meta-boxes': case 'users': case 'terms': case 'media': $folder = $method; $buffer = null; $this->widget = false; $this->setting = false; $this->fields = array(); // Read all fields for folder foreach (piklist::paths() as $add_on => $path) { $files = piklist::get_directory_list($path . '/parts/' . $folder); if (empty($files) && in_array($add_on, array('theme', 'parent-theme'))) { $files = piklist::get_directory_list($path . '/' . $folder); } ob_start(); foreach ($files as $part) { if ($folder == 'widgets' && stristr($part, '-form') || $folder != 'widgets') { if ($folder == 'settings') { $data = piklist::get_file_data($path . '/parts/' . $folder . '/' . $part, array('setting' => 'Setting')); $this->setting = $data['setting']; } elseif ($folder == 'widgets') { $data = piklist::get_file_data($path . '/parts/' . $folder . '/' . $part, array('title' => 'Title')); if (empty($data['title'])) { $data = piklist::get_file_data($path . '/parts/' . $folder . '/' . str_replace('-form', '', $part), array('title' => 'Title')); } $this->widget = $add_on . ':' . strtolower($data['title']); } ob_start(); @(include $path . '/parts/' . $folder . '/' . $part); ob_end_clean(); } } ob_end_clean(); } // Setup our defaults switch ($folder) { case 'meta-boxes': case 'media': $table = $wpdb->postmeta; $object_key = 'post_id'; $meta_id = 'meta_id'; $output['message'] = $folder == 'meta-boxes' ? __('Post Meta Updated...') : __('Media Meta Updated...'); break; case 'users': $table = $wpdb->usermeta; $object_key = 'user_id'; $meta_id = 'umeta_id'; $output['message'] = __('User Meta Updated...'); break; case 'terms': $table = $wpdb->termmeta; $object_key = 'term_id'; $meta_id = 'meta_id'; $output['message'] = __('Term Meta Updated...'); break; } // Run through fields and update the ones we need to update foreach ($this->fields as $index => $field) { switch ($folder) { case 'media': case 'meta-boxes': case 'users': case 'terms': $keys = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$table} WHERE meta_key = %s", $field['field']), ARRAY_A); foreach ($keys as $key) { if (!empty($key['meta_value'])) { $old = maybe_unserialize($key['meta_value']); if ($this->needs_update($old)) { $new = piklist::object_format($old); $new = isset($field['add_more']) && $field['add_more'] == true ? $new : current($new); if ($old != $new) { $result = $wpdb->update($table, array('meta_value' => maybe_serialize($new)), array($meta_id => $key[$meta_id], $object_key => $key[$object_key], 'meta_key' => $key['meta_key'])); } } } } break; case 'settings': remove_filter('pre_update_option_' . $field['context'], array('piklist_setting', 'pre_update_option'), 10, 2); $option = get_option($field['context']); if (isset($option[$field['field']['field']]) && $this->needs_update($option[$field['field']['field']])) { $option[$field['field']['field']] = piklist::object_format($option[$field['field']['field']]); // Helpers Dashboard Widgets field $option[$field['field']['field']] = isset($field['field']['add_more']) && $field['field']['add_more'] == true ? $option[$field['field']['field']] : current($option[$field['field']['field']]); update_option($field['context'], $option); } $output['message'] = __('Settings Updated...'); break; case 'widgets': $data = explode(':', $field['context']); $widgets = get_option('widget_piklist-universal-widget-' . $data[0]); if (!empty($widgets)) { foreach ($widgets as $widget_number => &$widget) { if (is_numeric($widget_number)) { foreach ($widget as $_field => &$_value) { if ($field['field']['field'] == $_field) { $old = maybe_unserialize($_value); if ($this->needs_update($old)) { $_value = maybe_serialize(piklist::object_format($old)); } } elseif ($_field == 'widget') { $old = maybe_unserialize($_value); $add_on = piklist::slug($data[0]); if (is_array($old) && substr($old[0], 0, strlen($add_on)) != $add_on) { $_value = piklist::slug($data[0] . '_' . $old[0]); } } } } } update_option('widget_piklist-universal-widget-' . $data[0], $widgets); $output['message'] = __('Widgets Updated...'); } break; } } $output['fields'] = array(); foreach ($this->fields as $index => $field) { if (is_array($field)) { array_push($output['fields'], (isset($field['context']) ? $field['context'] . ' - ' : null) . (is_array($field['field']) ? $field['field']['field'] : $field['field'])); } else { array_push($output['fields'], $field); } } break; } wp_send_json($output); }
/** * check_update * Check if a piklist plugin needs an update. * * @param string $file The plugin filename. * @param string $version The plugin version. * * @access public * @static * @since 1.0 */ public static function check_update($file, $version) { global $pagenow; if (!is_admin() || !current_user_can('manage_options')) { return; } $plugin = plugin_basename($file); if (is_plugin_active_for_network($plugin)) { piklist_admin::$network_wide = true; $versions = get_site_option('piklist_active_plugin_versions', array()); } elseif (is_plugin_active($plugin)) { piklist_admin::$network_wide = false; $versions = get_option('piklist_active_plugin_versions', array()); } else { return; } if (empty($versions[$plugin])) { $versions[$plugin][] = $version; } else { if (!is_array($versions[$plugin])) { $versions[$plugin] = array($versions[$plugin]); } $current_version = is_array($versions[$plugin]) ? current($versions[$plugin]) : $versions[$plugin]; if (version_compare($version, $current_version, '>')) { self::get_update($file, $version, $current_version); array_unshift($versions[$plugin], $version); } } if (piklist_admin::$network_wide) { update_site_option('piklist_active_plugin_versions', $versions); } else { update_option('piklist_active_plugin_versions', $versions); } }
/** * process_form * Process any form submissions. * * @access public * @static * @since 1.0 */ public static function process_form() { if (self::valid() && !piklist_admin::is_widget() && !piklist_admin::is_setting()) { $form_id = isset($_REQUEST[piklist::$prefix]['form_id']) ? $_REQUEST[piklist::$prefix]['form_id'] : false; if ($form_id) { self::$form_id = $form_id; } if (self::save()) { $redirect = isset($_REQUEST[piklist::$prefix]['redirect']) ? $_REQUEST[piklist::$prefix]['redirect'] : false; if ($redirect) { $redirect = preg_replace('/#.*/', '', $redirect); $url_arguments = array(); foreach (self::$form_submission as $scope => $fields) { foreach ($fields as $field) { if ($field['redirect']) { $url_arguments[$field['name']] = current($field['request_value']); } } } if (!empty($url_arguments)) { $redirect .= (stristr($redirect, '?') ? '&' : '?') . http_build_query($url_arguments); } wp_redirect($redirect); exit; } } } }
/** * part_process * Convert old tabs to Workflow tabs. * * @param array $part The part object. * * @access public * @static * @since 1.0 */ public static function part_process($part) { $page = isset($_REQUEST['page']) ? esc_attr($_REQUEST['page']) : false; if ($page && empty($part['data']['flow'])) { $part['data']['flow'] = array($part['data']['setting']); if (!$part['data']['tab']) { $admin_pages = piklist_admin::get('admin_pages'); foreach ($admin_pages as $admin_page) { if ($_REQUEST['page'] == $admin_page['menu_slug']) { break; } } $part['data']['tab'] = array(isset($admin_page['default_tab']) ? piklist::slug($admin_page['default_tab']) : 'general'); } } return $part; }
public static function register_taxonomies() { global $wp_taxonomies; self::$taxonomies = apply_filters('piklist_taxonomies', self::$taxonomies); $check = array(); foreach (self::$taxonomies as $taxonomy_name => $taxonomy) { $taxonomy['name'] = isset($taxonomy['name']) || is_numeric($taxonomy_name) ? $taxonomy['name'] : $taxonomy_name; $type = isset($taxonomy['object_type']) ? $taxonomy['object_type'] : $taxonomy['post_type']; if (!isset($taxonomy['update_count_callback'])) { $taxonomy['update_count_callback'] = '_update_generic_term_count'; } register_taxonomy($taxonomy['name'], $type, $taxonomy['configuration']); if (!isset($check[$taxonomy['name']]) || !$check[$taxonomy['name']]) { $check[$taxonomy['name']] = $taxonomy; } if (isset($taxonomy['configuration']['hide_meta_box']) && !empty($taxonomy['configuration']['hide_meta_box'])) { $object_types = is_array($type) ? $type : array($type); foreach ($object_types as $object_type) { if (!isset(self::$meta_boxes_hidden[$object_type])) { self::$meta_boxes_hidden[$object_type] = array(); } array_push(self::$meta_boxes_hidden[$object_type], $taxonomy['configuration']['hierarchical'] ? $taxonomy['name'] . 'div' : 'tagsdiv-' . $taxonomy['name']); } } add_action('admin_head', array('piklist_cpt', 'hide_meta_boxes'), 100); if (isset($taxonomy['configuration']['page_icon']) && !empty($taxonomy['configuration']['page_icon'])) { global $pagenow; if ($pagenow == 'edit-tags.php' && $_REQUEST['taxonomy'] == $taxonomy['name']) { piklist_admin::$page_icon = array('page_id' => isset($taxonomy['object_type']) && $taxonomy['object_type'] == 'user' ? '#icon-users.icon32' : '#icon-edit.icon32', 'icon_url' => $taxonomy['configuration']['page_icon']); } } } self::flush_rewrite_rules(md5(serialize($check)), 'piklist_taxonomy_rules_flushed'); }
/** * relate_field * Determine the default object id to relate to a field. * * @param array $field The field object. * * @access public * @static * @since 1.0 */ public static function relate_field($field) { global $wpdb; if (!isset($field['relate']) || !isset($field['relate']['scope'])) { return $field; } // Get the id of what we are relating the field to if (!isset($field['relate']['field'])) { switch ($field['relate']['scope']) { case 'post': case 'post_meta': $field['relate_to'] = piklist_admin::is_post(); break; case 'user': case 'user_meta': $field['relate_to'] = piklist_admin::is_user(); break; case 'comment': case 'comment_meta': $field['relate_to'] = piklist_admin::is_comment(); break; } } if (in_array($field['scope'], array('post_meta', 'user_meta', 'comment_meta'))) { $field['value'] = self::get_object_ids($field['object_id'], $field['scope'], $field['relate']['scope']); } else { $field['object_id'] = self::get_object_ids($field['object_id'], $field['scope'], $field['relate']['scope']); } return $field; }
function piklist_demo_post_types($post_types) { $post_types['piklist_demo'] = array('labels' => piklist('post_type_labels', 'Piklist Demos'), 'title' => __('Enter a new Demo Title'), 'menu_icon' => piklist_admin::responsive_admin() == true ? plugins_url('piklist/parts/img/piklist-menu-icon.svg') : plugins_url('piklist/parts/img/piklist-icon.png'), 'page_icon' => plugins_url('piklist/parts/img/piklist-page-icon-32.png'), 'supports' => array('title', 'revisions'), 'public' => true, 'admin_body_class' => array('piklist-demonstration', 'piklist-sample'), 'has_archive' => true, 'rewrite' => array('slug' => 'piklist-demo'), 'capability_type' => 'post', 'edit_columns' => array('title' => __('Demo'), 'author' => __('Assigned to')), 'hide_meta_box' => array('slug', 'author'), 'status' => array('draft' => array('label' => 'New', 'public' => true), 'demo' => array('label' => 'Demo', 'public' => true, 'exclude_from_search' => true, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true), 'lock' => array('label' => 'Lock', 'public' => true))); $post_types['piklist_lite_demo'] = array('labels' => piklist('post_type_labels', 'Lite Demo'), 'title' => __('Enter a new Demo Title'), 'menu_icon' => piklist_admin::responsive_admin() == true ? plugins_url('piklist/parts/img/piklist-menu-icon.svg') : plugins_url('piklist/parts/img/piklist-menu-icon.png'), 'page_icon' => plugins_url('piklist/parts/img/piklist-page-icon-32.png'), 'show_in_menu' => 'edit.php?post_type=piklist_demo', 'supports' => array('title', 'revisions'), 'public' => true, 'has_archive' => true, 'capability_type' => 'post', 'edit_columns' => array('title' => __('Title')), 'hide_meta_box' => array('slug', 'author')); return $post_types; }
/** * detect_post_type * Attempts to detect the post type given the state of the system when called. * * @return mixed The current post type or false. * * @access public * @static * @since 1.0 */ public static function detect_post_type($post_id = null) { global $typenow, $pagenow, $post; $post_type = false; if (piklist_admin::is_post()) { if (is_null($post_id)) { if ($post) { $post_id = $post->ID; } elseif (isset($_REQUEST['post'])) { $post_id = (int) $_REQUEST['post']; } } $post_type = get_post_type($post_id); if (!$post_type) { if ($typenow) { $post_type = $typenow; } elseif (isset($_REQUEST['post_type'])) { $post_type = esc_attr($_REQUEST['post_type']); } elseif ($pagenow == 'post-new.php') { $post_type = 'post'; } } } return $post_type; }