/** * Add or edit a column within a content type * * $params['id'] int The field ID * $params['name'] string The field name * $params['datatype'] int The datatype ID * $params['dtname'] string The datatype name * $params['coltype'] string The column type ("txt", "desc", "pick", etc) * $params['sister_field_id'] int (optional) The related field ID * $params['pickval'] string The related PICK pod name * $params['label'] string The field label * $params['comment'] string The field comment * $params['display_helper'] string (optional) The display helper name * $params['input_helper'] string (optional) The input helper name * $params['pick_filter'] string (optional) WHERE clause for PICK fields * $params['pick_orderby'] string (optional) ORDER BY clause for PICK fields * $params['required'] bool Is the field required? * $params['unique'] bool Is the field unique? * $params['multiple'] bool Is the PICK dropdown a multi-select? * * @param array $params An associative array of parameters * @since 1.7.9 */ function save_column($params) { if (defined('PODS_STRICT_MODE') && PODS_STRICT_MODE) { $params = pods_sanitize($params); } $params = (object) str_replace('@wp_', '{prefix}', $params); // Set defaults $params = (object) array_merge(array('id' => '', 'name' => '', 'datatype' => '', 'dtname' => '', 'coltype' => 'txt', 'sister_field_id' => 0, 'pickval' => '', 'label' => '', 'comment' => '', 'display_helper' => '', 'input_helper' => '', 'pick_filter' => '', 'pick_orderby' => '', 'required' => 0, 'unique' => 0, 'multiple' => 0), (array) $params); // Force Types $params->id = absint($params->id); $params->sister_field_id = absint($params->sister_field_id); $params->required = absint($params->required); $params->unique = absint($params->unique); $params->multiple = absint($params->multiple); $dbtypes = array('bool' => 'bool default 0', 'date' => 'datetime', 'num' => 'decimal(12,2)', 'txt' => 'varchar(128)', 'slug' => 'varchar(128)', 'code' => 'longtext', 'desc' => 'longtext'); $dbtypes = apply_filters('pods_column_dbtypes', $dbtypes); // Add new column if (empty($params->id)) { $params->name = pods_clean_name($params->name); if (empty($params->name)) { return $this->oh_snap('<e>Enter a column name'); } elseif (in_array($params->name, array('id', 'name', 'type', 'created', 'modified', 'p', 't'))) { return $this->oh_snap("<e>{$params->name} is a reserved name"); } $sql = "SELECT id FROM @wp_pod_fields WHERE datatype = {$params->datatype} AND name = '{$params->name}' LIMIT 1"; pod_query($sql, 'Cannot get fields', 'Column by this name already exists'); if ('slug' == $params->coltype) { $sql = "SELECT id FROM @wp_pod_fields WHERE datatype = {$params->datatype} AND coltype = 'slug' LIMIT 1"; pod_query($sql, 'Too many permalinks', 'This pod already has a permalink column'); } // Sink the new column to the bottom of the list $weight = 0; $result = pod_query("SELECT weight FROM @wp_pod_fields WHERE datatype = {$params->datatype} ORDER BY weight DESC LIMIT 1"); if (0 < mysql_num_rows($result)) { $row = mysql_fetch_assoc($result); $weight = (int) $row['weight'] + 1; } if ('pick' != $params->coltype) { $params->pickval = ''; $params->pick_filter = ''; $params->pick_orderby = ''; $params->sister_field_id = 0; $params->multiple = 0; } $field_id = pod_query("INSERT INTO @wp_pod_fields (datatype, name, label, comment, display_helper, input_helper, coltype, pickval, pick_filter, pick_orderby, sister_field_id, required, `unique`, `multiple`, weight) VALUES ('{$params->datatype}', '{$params->name}', '{$params->label}', '{$params->comment}', '{$params->display_helper}', '{$params->input_helper}', '{$params->coltype}', '{$params->pickval}', '{$params->pick_filter}', '{$params->pick_orderby}', '{$params->sister_field_id}', '{$params->required}', '{$params->unique}', '{$params->multiple}', '{$weight}')", 'Cannot add new field'); if ('pick' != $params->coltype && 'file' != $params->coltype) { $dbtype = $dbtypes[$params->coltype]; pod_query("ALTER TABLE `@wp_pod_tbl_{$params->dtname}` ADD COLUMN `{$params->name}` {$dbtype}", 'Cannot create new column'); } else { pod_query("UPDATE @wp_pod_fields SET sister_field_id = '{$field_id}' WHERE id = '{$params->sister_field_id}' LIMIT 1", 'Cannot update sister field'); } } else { if ('id' == $params->name) { return $this->oh_snap("<e>{$params->name} is not editable."); } $sql = "SELECT id FROM @wp_pod_fields WHERE datatype = {$params->datatype} AND id != {$params->id} AND name = '{$params->name}' LIMIT 1"; pod_query($sql, 'Column already exists', "{$params->name} already exists."); $sql = "SELECT name, coltype FROM @wp_pod_fields WHERE id = {$params->id} LIMIT 1"; $result = pod_query($sql); if (0 < mysql_num_rows($result)) { $row = mysql_fetch_assoc($result); $old_coltype = $row['coltype']; $old_name = $row['name']; $dbtype = $dbtypes[$params->coltype]; $pickval = 'pick' != $params->coltype || empty($params->pickval) ? '' : "{$params->pickval}"; if ($params->coltype != $old_coltype) { if ('pick' == $params->coltype || 'file' == $params->coltype) { if ('pick' != $old_coltype && 'file' != $old_coltype) { pod_query("ALTER TABLE `@wp_pod_tbl_{$params->dtname}` DROP COLUMN `{$old_name}`"); } } elseif ('pick' == $old_coltype || 'file' == $old_coltype) { pod_query("ALTER TABLE `@wp_pod_tbl_{$params->dtname}` ADD COLUMN `{$params->name}` {$dbtype}", 'Cannot create column'); pod_query("UPDATE @wp_pod_fields SET sister_field_id = NULL WHERE sister_field_id = {$params->id}"); pod_query("DELETE FROM @wp_pod_rel WHERE field_id = {$params->id}"); } else { pod_query("ALTER TABLE `@wp_pod_tbl_{$params->dtname}` CHANGE `{$old_name}` `{$params->name}` {$dbtype}"); } } elseif ($params->name != $old_name && 'pick' != $params->coltype && 'file' != $params->coltype) { pod_query("ALTER TABLE `@wp_pod_tbl_{$params->dtname}` CHANGE `{$old_name}` `{$params->name}` {$dbtype}"); } if ('pick' != $params->coltype) { $params->pickval = ''; $params->pick_filter = ''; $params->pick_orderby = ''; $params->sister_field_id = 0; $params->multiple = 0; } $sql = "\n UPDATE\n @wp_pod_fields\n SET\n name = '{$params->name}',\n label = '{$params->label}',\n comment = '{$params->comment}',\n coltype = '{$params->coltype}',\n pickval = '{$params->pickval}',\n display_helper = '{$params->display_helper}',\n input_helper = '{$params->input_helper}',\n pick_filter = '{$params->pick_filter}',\n pick_orderby = '{$params->pick_orderby}',\n sister_field_id = '{$params->sister_field_id}',\n required = '{$params->required}',\n `unique` = '{$params->unique}',\n `multiple` = '{$params->multiple}'\n WHERE\n id = {$params->id}\n LIMIT\n 1\n "; pod_query($sql, 'Cannot edit column'); } } }
/** * Get list of components available * * @since 2.0 */ public function get_components() { $components = pods_transient_get('pods_components'); if (1 == pods_var('pods_debug_components', 'get', 0) && pods_is_admin(array('pods'))) { $components = array(); } if (PodsInit::$version != PODS_VERSION || !is_array($components) || empty($components) || is_admin() && isset($_GET['page']) && 'pods-components' == $_GET['page'] && 1 !== pods_transient_get('pods_components_refresh')) { do_action('pods_components_get'); $component_dir = @opendir(untrailingslashit($this->components_dir)); $component_files = array(); if (false !== $component_dir) { while (false !== ($file = readdir($component_dir))) { if ('.' == substr($file, 0, 1)) { continue; } elseif (is_dir($this->components_dir . $file)) { $component_subdir = @opendir($this->components_dir . $file); if ($component_subdir) { while (false !== ($subfile = readdir($component_subdir))) { if ('.' == substr($subfile, 0, 1)) { continue; } elseif ('.php' == substr($subfile, -4)) { $component_files[] = str_replace('\\', '/', $file . '/' . $subfile); } } closedir($component_subdir); } } elseif ('.php' == substr($file, -4)) { $component_files[] = $file; } } closedir($component_dir); } $default_headers = array('ID' => 'ID', 'Name' => 'Name', 'ShortName' => 'Short Name', 'PluginName' => 'Plugin Name', 'ComponentName' => 'Component Name', 'URI' => 'URI', 'MenuName' => 'Menu Name', 'MenuPage' => 'Menu Page', 'MenuAddPage' => 'Menu Add Page', 'MustUse' => 'Must Use', 'Description' => 'Description', 'Version' => 'Version', 'Category' => 'Category', 'Author' => 'Author', 'AuthorURI' => 'Author URI', 'Class' => 'Class', 'Hide' => 'Hide', 'PluginDependency' => 'Plugin Dependency', 'ThemeDependency' => 'Theme Dependency', 'DeveloperMode' => 'Developer Mode', 'TablelessMode' => 'Tableless Mode', 'Capability' => 'Capability', 'Plugin' => 'Plugin'); $component_files = apply_filters('pods_components_register', $component_files); $components = array(); foreach ($component_files as $component_file) { $external = false; if (is_array($component_file) && isset($component_file['File'])) { $component = $component_file = $component_file['File']; $external = true; } else { $component = $this->components_dir . $component_file; } if (!is_readable($component)) { continue; } $component_data = get_file_data($component, $default_headers, 'pods_component'); if (empty($component_data['Name']) && empty($component_data['ComponentName']) && empty($component_data['PluginName']) || 'yes' == $component_data['Hide']) { continue; } if (isset($component_data['Plugin']) && pods_is_plugin_active($component_data['Plugin'])) { continue; } if (empty($component_data['Name'])) { if (!empty($component_data['ComponentName'])) { $component_data['Name'] = $component_data['ComponentName']; } elseif (!empty($component_data['PluginName'])) { $component_data['Name'] = $component_data['PluginName']; } } if (empty($component_data['ShortName'])) { $component_data['ShortName'] = $component_data['Name']; } if (empty($component_data['MenuName'])) { $component_data['MenuName'] = $component_data['Name']; } if (empty($component_data['Class'])) { $component_data['Class'] = 'Pods_' . pods_clean_name(basename($component, '.php'), false); } if (empty($component_data['ID'])) { $component_data['ID'] = $component_data['Name']; } $component_data['ID'] = sanitize_title($component_data['ID']); if ('on' == strtolower($component_data['DeveloperMode']) || 1 == $component_data['DeveloperMode']) { $component_data['DeveloperMode'] = true; } else { $component_data['DeveloperMode'] = false; } if ('on' == strtolower($component_data['TablelessMode']) || 1 == $component_data['TablelessMode']) { $component_data['TablelessMode'] = true; } else { $component_data['TablelessMode'] = false; } $component_data['External'] = (bool) $external; if ('on' == strtolower($component_data['MustUse']) || '1' == $component_data['MustUse']) { $component_data['MustUse'] = true; } elseif ('off' == strtolower($component_data['MustUse']) || '0' == $component_data['MustUse']) { $component_data['MustUse'] = false; } else { $component_data['MustUse'] = $component_data['External']; } $component_data['File'] = $component_file; $components[$component_data['ID']] = $component_data; } ksort($components); pods_transient_set('pods_components_refresh', 1, 60 * 60 * 12); pods_transient_set('pods_components', $components); } if (1 == pods_var('pods_debug_components', 'get', 0) && pods_is_admin(array('pods'))) { pods_debug($components); } $this->components = $components; return $this->components; }
/** * Get information about an objects MySQL table * * @param string $object_type * @param string $object The object to look for * @param null $name (optional) Name of the pod to load * @param array $pod (optional) Array with pod information * @param array $field (optional) Array with field information * * @return array|bool * * @since 2.0 */ public function get_table_info($object_type, $object, $name = null, $pod = null, $field = null) { /** * @var $wpdb wpdb * @var $sitepress SitePress * @var $icl_adjust_id_url_filter_off boolean */ global $wpdb, $sitepress, $icl_adjust_id_url_filter_off, $polylang; // @todo Handle $object arrays for Post Types, Taxonomies, Comments (table pulled from first object in array) $info = array('object_type' => $object_type, 'type' => null, 'object_name' => $object, 'object_hierarchical' => false, 'table' => $object, 'meta_table' => $object, 'pod_table' => $wpdb->prefix . 'pods_' . (empty($object) ? $name : $object), 'field_id' => 'id', 'field_index' => 'name', 'field_slug' => null, 'field_type' => null, 'field_parent' => null, 'field_parent_select' => null, 'meta_field_id' => 'id', 'meta_field_index' => 'name', 'meta_field_value' => 'name', 'pod_field_id' => 'id', 'pod_field_index' => 'name', 'pod_field_slug' => null, 'pod_field_parent' => null, 'join' => array(), 'where' => null, 'where_default' => null, 'orderby' => null, 'pod' => null, 'recurse' => false); if (empty($object_type)) { $object_type = 'post_type'; $object = 'post'; } elseif (empty($object) && in_array($object_type, array('user', 'media', 'comment'))) { $object = $object_type; } $pod_name = $pod; if (is_array($pod_name)) { $pod_name = pods_var_raw('name', $pod_name, version_compare(PHP_VERSION, '5.4.0', '>=') ? json_encode($pod_name, JSON_UNESCAPED_UNICODE) : json_encode($pod_name), null, true); } else { $pod_name = $object; } $field_name = $field; if (is_array($field_name)) { $field_name = pods_var_raw('name', $field_name, version_compare(PHP_VERSION, '5.4.0', '>=') ? json_encode($pod_name, JSON_UNESCAPED_UNICODE) : json_encode($field_name), null, true); } $transient = 'pods_' . $wpdb->prefix . '_get_table_info_' . md5($object_type . '_object_' . $object . '_name_' . $name . '_pod_' . $pod_name . '_field_' . $field_name); $current_language = false; $current_language_t_id = $current_language_tt_id = 0; // WPML support if (is_object($sitepress) && !$icl_adjust_id_url_filter_off) { $current_language = pods_sanitize(ICL_LANGUAGE_CODE); } elseif (is_object($polylang) && function_exists('pll_current_language')) { $current_language = pods_sanitize(pll_current_language('slug')); if (!empty($current_language)) { $current_language_t_id = (int) $polylang->get_language($current_language)->term_id; $current_language_tt_id = (int) $polylang->get_language($current_language)->term_taxonomy_id; } } if (!empty($current_language)) { $transient = 'pods_' . $wpdb->prefix . '_get_table_info_' . $current_language . '_' . md5($object_type . '_object_' . $object . '_name_' . $name . '_pod_' . $pod_name . '_field_' . $field_name); } $_info = false; if (isset(self::$table_info_cache[$transient])) { // Prefer info from the object internal cache $_info = self::$table_info_cache[$transient]; } elseif (pods_api_cache()) { $_info = pods_transient_get($transient); if (false === $_info && !did_action('init')) { $_info = pods_transient_get($transient . '_pre_init'); } } if (false !== $_info) { // Data was cached, use that $info = $_info; } else { // Data not cached, load it up $_info = $this->get_table_info_load($object_type, $object, $name, $pod); if (isset($_info['type'])) { // Allow function to override $object_type $object_type = $_info['type']; } $info = array_merge($info, $_info); } if (0 === strpos($object_type, 'post_type') || 'media' == $object_type || in_array(pods_var_raw('type', $info['pod']), array('post_type', 'media'))) { $info['table'] = $wpdb->posts; $info['meta_table'] = $wpdb->postmeta; $info['field_id'] = 'ID'; $info['field_index'] = 'post_title'; $info['field_slug'] = 'post_name'; $info['field_type'] = 'post_type'; $info['field_parent'] = 'post_parent'; $info['field_parent_select'] = '`t`.`' . $info['field_parent'] . '`'; $info['meta_field_id'] = 'post_id'; $info['meta_field_index'] = 'meta_key'; $info['meta_field_value'] = 'meta_value'; if ('media' == $object_type) { $object = 'attachment'; } if (empty($name)) { $prefix = 'post_type-'; // Make sure we actually have the prefix before trying anything with the name if (0 === strpos($object_type, $prefix)) { $name = substr($object_type, strlen($prefix), strlen($object_type)); } } if ('media' != $object_type) { $object_type = 'post_type'; } $post_type = pods_sanitize(empty($object) ? $name : $object); if ('attachment' == $post_type || 'media' == $object_type) { $info['pod_table'] = $wpdb->prefix . 'pods_media'; } else { $info['pod_table'] = $wpdb->prefix . 'pods_' . pods_clean_name($post_type, true, false); } $post_type_object = get_post_type_object($post_type); if (is_object($post_type_object) && $post_type_object->hierarchical) { $info['object_hierarchical'] = true; } /** * Default Post Status to query for. * * Use to change "default" post status from publish to any other status or statuses. * * @param array $post_status List of post statuses. Default is 'publish' * @param string $post_type Post type of current object * @param array $info Array of information about the object. * @param string $object Type of object * @param string $name Name of pod to load * @param array $pod Array with Pod information. Result of PodsAPI::load_pod() * @param array $field Array with field information * * @since unknown */ $post_status = apply_filters('pods_api_get_table_info_default_post_status', array('publish'), $post_type, $info, $object_type, $object, $name, $pod, $field); $info['where'] = array('post_type' => '`t`.`' . $info['field_type'] . '` = "' . $post_type . '"'); if ('post_type' == $object_type) { $info['where_default'] = '`t`.`post_status` IN ( "' . implode('", "', $post_status) . '" )'; } $info['orderby'] = '`t`.`menu_order`, `t`.`' . $info['field_index'] . '`, `t`.`post_date`'; // WPML support if (is_object($sitepress) && $sitepress->is_translated_post_type($post_type) && !$icl_adjust_id_url_filter_off) { $info['join']['wpml_translations'] = "\n LEFT JOIN `{$wpdb->prefix}icl_translations` AS `wpml_translations`\n ON `wpml_translations`.`element_id` = `t`.`ID`\n AND `wpml_translations`.`element_type` = 'post_{$post_type}'\n AND `wpml_translations`.`language_code` = '{$current_language}'\n "; $info['join']['wpml_languages'] = "\n LEFT JOIN `{$wpdb->prefix}icl_languages` AS `wpml_languages`\n ON `wpml_languages`.`code` = `wpml_translations`.`language_code` AND `wpml_languages`.`active` = 1\n "; $info['where']['wpml_languages'] = "`wpml_languages`.`code` IS NOT NULL"; } elseif (is_object($polylang) && !empty($current_language) && function_exists('pll_is_translated_post_type') && pll_is_translated_post_type($post_type)) { $info['join']['polylang_languages'] = "\n LEFT JOIN `{$wpdb->term_relationships}` AS `polylang_languages`\n ON `polylang_languages`.`object_id` = `t`.`ID`\n AND `polylang_languages`.`term_taxonomy_id` = {$current_language_tt_id}\n "; $info['where']['polylang_languages'] = "`polylang_languages`.`object_id` IS NOT NULL"; } $info['object_fields'] = $this->get_wp_object_fields($object_type, $info['pod']); } elseif (0 === strpos($object_type, 'taxonomy') || in_array($object_type, array('nav_menu', 'post_format')) || 'taxonomy' == pods_var_raw('type', $info['pod'])) { $info['table'] = $info['meta_table'] = $wpdb->terms; $info['join']['tt'] = "LEFT JOIN `{$wpdb->term_taxonomy}` AS `tt` ON `tt`.`term_id` = `t`.`term_id`"; $info['field_id'] = $info['meta_field_id'] = 'term_id'; $info['field_index'] = $info['meta_field_index'] = $info['meta_field_value'] = 'name'; $info['field_slug'] = 'slug'; $info['field_type'] = 'taxonomy'; $info['field_parent'] = 'parent'; $info['field_parent_select'] = '`tt`.`' . $info['field_parent'] . '`'; if ('nav_menu' == $object_type) { $object = 'nav_menu'; } elseif ('post_format' == $object_type) { $object = 'post_format'; } if (empty($name)) { $prefix = 'taxonomy-'; // Make sure we actually have the prefix before trying anything with the name if (0 === strpos($object_type, $prefix)) { $name = substr($object_type, strlen($prefix), strlen($object_type)); } } if (!in_array($object_type, array('nav_menu', 'post_format'))) { $object_type = 'taxonomy'; } $taxonomy = pods_sanitize(empty($object) ? $name : $object); $info['pod_table'] = $wpdb->prefix . 'pods_' . pods_clean_name($taxonomy, true, false); $taxonomy_object = get_taxonomy($taxonomy); if (is_object($taxonomy_object) && $taxonomy_object->hierarchical) { $info['object_hierarchical'] = true; } $info['where'] = array('tt.taxonomy' => '`tt`.`' . $info['field_type'] . '` = "' . $taxonomy . '"'); // WPML Support if (is_object($sitepress) && $sitepress->is_translated_taxonomy($taxonomy) && !$icl_adjust_id_url_filter_off) { $info['join']['wpml_translations'] = "\n LEFT JOIN `{$wpdb->prefix}icl_translations` AS `wpml_translations`\n ON `wpml_translations`.`element_id` = `tt`.`term_taxonomy_id`\n AND `wpml_translations`.`element_type` = 'tax_{$taxonomy}'\n AND `wpml_translations`.`language_code` = '{$current_language}'\n "; $info['join']['wpml_languages'] = "\n LEFT JOIN `{$wpdb->prefix}icl_languages` AS `wpml_languages`\n ON `wpml_languages`.`code` = `wpml_translations`.`language_code` AND `wpml_languages`.`active` = 1\n "; $info['where']['wpml_languages'] = "`wpml_languages`.`code` IS NOT NULL"; } elseif (is_object($polylang) && !empty($current_language) && function_exists('pll_is_translated_taxonomy') && pll_is_translated_taxonomy($taxonomy)) { $info['join']['polylang_languages'] = "\n LEFT JOIN `{$wpdb->termmeta}` AS `polylang_languages`\n ON `polylang_languages`.`term_id` = `t`.`term_id`\n AND `polylang_languages`.`meta_value` = {$current_language_t_id}\n "; $info['where']['polylang_languages'] = "`polylang_languages`.`term_id` IS NOT NULL"; } $info['object_fields'] = $this->get_wp_object_fields($object_type, $info['pod']); } elseif ('user' == $object_type || 'user' == pods_var_raw('type', $info['pod'])) { $info['table'] = $wpdb->users; $info['meta_table'] = $wpdb->usermeta; $info['pod_table'] = $wpdb->prefix . 'pods_user'; $info['field_id'] = 'ID'; $info['field_index'] = 'display_name'; $info['field_slug'] = 'user_nicename'; $info['meta_field_id'] = 'user_id'; $info['meta_field_index'] = 'meta_key'; $info['meta_field_value'] = 'meta_value'; $info['where'] = array('user_status' => '`t`.`user_status` = 0'); $info['object_fields'] = $this->get_wp_object_fields($object_type, $info['pod']); } elseif ('comment' == $object_type || 'comment' == pods_var_raw('type', $info['pod'])) { //$info[ 'object_hierarchical' ] = true; $info['table'] = $wpdb->comments; $info['meta_table'] = $wpdb->commentmeta; $info['pod_table'] = $wpdb->prefix . 'pods_comment'; $info['field_id'] = 'comment_ID'; $info['field_index'] = 'comment_date'; $info['field_type'] = 'comment_type'; $info['field_parent'] = 'comment_parent'; $info['field_parent_select'] = '`t`.`' . $info['field_parent'] . '`'; $info['meta_field_id'] = 'comment_id'; $info['meta_field_index'] = 'meta_key'; $info['meta_field_value'] = 'meta_value'; $object = 'comment'; $comment_type = empty($object) ? $name : $object; $comment_type_clause = '`t`.`' . $info['field_type'] . '` = "' . $comment_type . '"'; if ('comment' == $comment_type) { $comment_type_clause = '( ' . $comment_type_clause . ' OR `t`.`' . $info['field_type'] . '` = "" )'; } $info['where'] = array('comment_approved' => '`t`.`comment_approved` = 1', 'comment_type' => $comment_type_clause); $info['orderby'] = '`t`.`' . $info['field_index'] . '` DESC, `t`.`' . $info['field_id'] . '`'; } elseif (in_array($object_type, array('option', 'settings')) || 'settings' == pods_var_raw('type', $info['pod'])) { $info['table'] = $wpdb->options; $info['meta_table'] = $wpdb->options; $info['field_id'] = 'option_id'; $info['field_index'] = 'option_name'; $info['meta_field_id'] = 'option_id'; $info['meta_field_index'] = 'option_name'; $info['meta_field_value'] = 'option_value'; $info['orderby'] = '`t`.`' . $info['field_index'] . '` ASC'; } elseif (is_multisite() && (in_array($object_type, array('site_option', 'site_settings')) || 'site_settings' == pods_var_raw('type', $info['pod']))) { $info['table'] = $wpdb->sitemeta; $info['meta_table'] = $wpdb->sitemeta; $info['field_id'] = 'site_id'; $info['field_index'] = 'meta_key'; $info['meta_field_id'] = 'site_id'; $info['meta_field_index'] = 'meta_key'; $info['meta_field_value'] = 'meta_value'; $info['orderby'] = '`t`.`' . $info['field_index'] . '` ASC'; } elseif (is_multisite() && 'network' == $object_type) { // Network = Site $info['table'] = $wpdb->site; $info['meta_table'] = $wpdb->sitemeta; $info['field_id'] = 'id'; $info['field_index'] = 'domain'; $info['meta_field_id'] = 'site_id'; $info['meta_field_index'] = 'meta_key'; $info['meta_field_value'] = 'meta_value'; $info['orderby'] = '`t`.`' . $info['field_index'] . '` ASC, `t`.`path` ASC, `t`.`' . $info['field_id'] . '`'; } elseif (is_multisite() && 'site' == $object_type) { // Site = Blog $info['table'] = $wpdb->blogs; $info['field_id'] = 'blog_id'; $info['field_index'] = 'domain'; $info['field_type'] = 'site_id'; $info['where'] = array('archived' => '`t`.`archived` = 0', 'spam' => '`t`.`spam` = 0', 'deleted' => '`t`.`deleted` = 0', 'site_id' => '`t`.`' . $info['field_type'] . '` = ' . (int) get_current_site()->id); $info['orderby'] = '`t`.`' . $info['field_index'] . '` ASC, `t`.`path` ASC, `t`.`' . $info['field_id'] . '`'; } elseif ('table' == $object_type || 'table' == pods_var_raw('type', $info['pod'])) { $info['table'] = empty($object) ? $name : $object; $info['pod_table'] = $wpdb->prefix . 'pods_' . $info['table']; if (!empty($field) && is_array($field)) { $info['table'] = pods_var_raw('pick_table', pods_var_raw('options', $field, $field)); $info['field_id'] = pods_var_raw('pick_table_id', pods_var_raw('options', $field, $field)); $info['field_index'] = $info['meta_field_index'] = $info['meta_field_value'] = pods_var_raw('pick_table_index', pods_var_raw('options', $field, $field)); } } $info['table'] = pods_clean_name($info['table'], false, false); $info['meta_table'] = pods_clean_name($info['meta_table'], false, false); $info['pod_table'] = pods_clean_name($info['pod_table'], false, false); $info['field_id'] = pods_clean_name($info['field_id'], false, false); $info['field_index'] = pods_clean_name($info['field_index'], false, false); $info['field_slug'] = pods_clean_name($info['field_slug'], false, false); $info['meta_field_id'] = pods_clean_name($info['meta_field_id'], false, false); $info['meta_field_index'] = pods_clean_name($info['meta_field_index'], false, false); $info['meta_field_value'] = pods_clean_name($info['meta_field_value'], false, false); if (empty($info['orderby'])) { $info['orderby'] = '`t`.`' . $info['field_index'] . '`, `t`.`' . $info['field_id'] . '`'; } if ('table' == pods_var_raw('storage', $info['pod']) && !in_array($object_type, array('pod', 'table'))) { $info['join']['d'] = 'LEFT JOIN `' . $info['pod_table'] . '` AS `d` ON `d`.`id` = `t`.`' . $info['field_id'] . '`'; //$info[ 'select' ] .= ', `d`.*'; } if (!empty($info['pod']) && is_array($info['pod'])) { $info['recurse'] = true; } $info['type'] = $object_type; $info['object_name'] = $object; if (pods_api_cache()) { if (!did_action('init')) { $transient .= '_pre_init'; } pods_transient_set($transient, $info); } self::$table_info_cache[$transient] = apply_filters('pods_api_get_table_info', $info, $object_type, $object, $name, $pod, $field, $this); return self::$table_info_cache[$transient]; }
echo pods_clean_name($attributes['name']); ?> .find( 'li.pods-file:first' ).slideDown( 'fast' ); var items = list_<?php echo pods_clean_name($attributes['name']); ?> .find( 'li.pods-file' ), itemCount = items.size(); if ( 0 < maxFiles_<?php echo pods_clean_name($attributes['name']); ?> && itemCount > maxFiles_<?php echo pods_clean_name($attributes['name']); ?> ) { items.each( function ( idx, elem ) { if ( idx + 1 > maxFiles_<?php echo pods_clean_name($attributes['name']); ?> ) { jQuery( elem ).remove(); } } ); } } } ); } ); </script>
/** * Get data from relationship objects * * @param array $object_params Object data parameters * * @return array|bool Object data */ public function get_object_data($object_params = null) { global $wpdb, $polylang, $sitepress, $icl_adjust_id_url_filter_off; $current_language = false; // WPML support if (is_object($sitepress) && !$icl_adjust_id_url_filter_off) { $current_language = pods_sanitize(ICL_LANGUAGE_CODE); } elseif (function_exists('pll_current_language')) { $current_language = pll_current_language('slug'); } $object_params = array_merge(array('name' => '', 'value' => '', 'options' => array(), 'pod' => '', 'id' => '', 'context' => '', 'data_params' => array('query' => ''), 'page' => 1, 'limit' => 0), $object_params); $name = $object_params['name']; $value = $object_params['value']; $options = $object_params['options'] = (array) $object_params['options']; $pod = $object_params['pod']; $id = $object_params['id']; $context = $object_params['context']; $data_params = $object_params['data_params'] = (array) $object_params['data_params']; $page = min(1, (int) $object_params['page']); $limit = (int) $object_params['limit']; if (isset($options['options'])) { $options = array_merge($options, $options['options']); unset($options['options']); } $data = apply_filters('pods_field_pick_object_data', null, $name, $value, $options, $pod, $id, $object_params); $items = array(); if (!isset($options[self::$type . '_object'])) { $data = pods_var_raw('data', $options, array(), null, true); } $simple = false; if (null === $data) { $data = array(); if ('custom-simple' == $options[self::$type . '_object']) { $custom = pods_var_raw(self::$type . '_custom', $options, ''); $custom = apply_filters('pods_form_ui_field_pick_custom_values', $custom, $name, $value, $options, $pod, $id, $object_params); if (!empty($custom)) { if (!is_array($custom)) { $data = array(); $custom = explode("\n", trim($custom)); foreach ($custom as $custom_value) { $custom_label = explode('|', $custom_value); if (empty($custom_label)) { continue; } if (1 == count($custom_label)) { $custom_label = $custom_value; } else { $custom_value = $custom_label[0]; $custom_label = $custom_label[1]; } $custom_value = trim((string) $custom_value); $custom_label = trim((string) $custom_label); $data[$custom_value] = $custom_label; } } else { $data = $custom; } $simple = true; } } elseif (isset(self::$related_objects[$options[self::$type . '_object']]) && isset(self::$related_objects[$options[self::$type . '_object']]['data']) && !empty(self::$related_objects[$options[self::$type . '_object']]['data'])) { $data = self::$related_objects[$options[self::$type . '_object']]['data']; $simple = true; } elseif (isset(self::$related_objects[$options[self::$type . '_object']]) && isset(self::$related_objects[$options[self::$type . '_object']]['data_callback']) && is_callable(self::$related_objects[$options[self::$type . '_object']]['data_callback'])) { $data = call_user_func_array(self::$related_objects[$options[self::$type . '_object']]['data_callback'], array($name, $value, $options, $pod, $id)); $simple = true; // Cache data from callback if (!empty($data)) { self::$related_objects[$options[self::$type . '_object']]['data'] = $data; } } elseif ('simple_value' != $context) { $pick_val = pods_var(self::$type . '_val', $options); if ('table' == pods_var(self::$type . '_object', $options)) { $pick_val = pods_var(self::$type . '_table', $options, $pick_val, null, true); } if ('__current__' == $pick_val) { if (is_object($pod)) { $pick_val = $pod->pod; } elseif (is_array($pod)) { $pick_val = $pod['name']; } elseif (0 < strlen($pod)) { $pick_val = $pod; } } $options['table_info'] = pods_api()->get_table_info(pods_var(self::$type . '_object', $options), $pick_val, null, null, $options); $search_data = pods_data(); $search_data->table($options['table_info']); if (isset($options['table_info']['pod']) && !empty($options['table_info']['pod']) && isset($options['table_info']['pod']['name'])) { $search_data->pod = $options['table_info']['pod']['name']; $search_data->fields = $options['table_info']['pod']['fields']; } $params = array('select' => "`t`.`{$search_data->field_id}`, `t`.`{$search_data->field_index}`", 'table' => $search_data->table, 'where' => pods_var_raw(self::$type . '_where', $options, (array) $options['table_info']['where_default'], null, true), 'orderby' => pods_var_raw(self::$type . '_orderby', $options, null, null, true), 'groupby' => pods_var_raw(self::$type . '_groupby', $options, null, null, true), 'pagination' => false, 'search' => false); if (in_array($options[self::$type . '_object'], array('site', 'network'))) { $params['select'] .= ', `t`.`path`'; } if (!empty($params['where']) && (array) $options['table_info']['where_default'] != $params['where']) { $params['where'] = pods_evaluate_tags($params['where'], true); } if (empty($params['where']) || !is_array($params['where']) && strlen(trim($params['where'])) < 1) { $params['where'] = array(); } elseif (!is_array($params['where'])) { $params['where'] = (array) $params['where']; } if ('value_to_label' == $context) { $params['where'][] = "`t`.`{$search_data->field_id}` = " . number_format($value, 0, '', ''); } /* not needed yet if ( !empty( $params[ 'orderby' ] ) ) $params[ 'orderby' ] = pods_evaluate_tags( $params[ 'orderby' ], true ); if ( !empty( $params[ 'groupby' ] ) ) $params[ 'groupby' ] = pods_evaluate_tags( $params[ 'groupby' ], true );*/ $display = trim(pods_var(self::$type . '_display', $options), ' {@}'); if (0 < strlen($display)) { if (isset($options['table_info']['pod']) && !empty($options['table_info']['pod'])) { if (isset($options['table_info']['pod']['object_fields']) && isset($options['table_info']['pod']['object_fields'][$display])) { $search_data->field_index = $display; $params['select'] = "`t`.`{$search_data->field_id}`, `t`.`{$search_data->field_index}`"; } elseif (isset($options['table_info']['pod']['fields'][$display])) { $search_data->field_index = $display; if ('table' == $options['table_info']['pod']['storage'] && !in_array($options['table_info']['pod']['type'], array('pod', 'table'))) { $params['select'] = "`t`.`{$search_data->field_id}`, `d`.`{$search_data->field_index}`"; } elseif ('meta' == $options['table_info']['pod']['storage']) { $params['select'] = "`t`.`{$search_data->field_id}`, `{$search_data->field_index}`.`meta_value` AS {$search_data->field_index}"; } else { $params['select'] = "`t`.`{$search_data->field_id}`, `t`.`{$search_data->field_index}`"; } } } elseif (isset($options['table_info']['object_fields']) && isset($options['table_info']['object_fields'][$display])) { $search_data->field_index = $display; $params['select'] = "`t`.`{$search_data->field_id}`, `t`.`{$search_data->field_index}`"; } } $autocomplete = false; if ('single' == pods_var(self::$type . '_format_type', $options, 'single') && 'autocomplete' == pods_var(self::$type . '_format_single', $options, 'dropdown')) { $autocomplete = true; } elseif ('multi' == pods_var(self::$type . '_format_type', $options, 'single') && 'autocomplete' == pods_var(self::$type . '_format_multi', $options, 'checkbox')) { $autocomplete = true; } $hierarchy = false; if ('data' == $context && !$autocomplete) { if ('single' == pods_var(self::$type . '_format_type', $options, 'single') && in_array(pods_var(self::$type . '_format_single', $options, 'dropdown'), array('dropdown', 'radio'))) { $hierarchy = true; } elseif ('multi' == pods_var(self::$type . '_format_type', $options, 'single') && in_array(pods_var(self::$type . '_format_multi', $options, 'checkbox'), array('multiselect', 'checkbox'))) { $hierarchy = true; } } if ($hierarchy && $options['table_info']['object_hierarchical'] && !empty($options['table_info']['field_parent'])) { $params['select'] .= ', ' . $options['table_info']['field_parent_select']; } if ($autocomplete) { if (0 == $limit) { $limit = 30; } $params['limit'] = apply_filters('pods_form_ui_field_pick_autocomplete_limit', $limit, $name, $value, $options, $pod, $id, $object_params); if (is_array($value) && $params['limit'] < count($value)) { $params['limit'] = count($value); } $params['page'] = $page; if ('admin_ajax_relationship' == $context) { $lookup_where = array($search_data->field_index => "`t`.`{$search_data->field_index}` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"); // @todo Hook into WPML for each table if ($wpdb->users == $search_data->table) { $lookup_where['display_name'] = "`t`.`display_name` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"; $lookup_where['user_login'] = "******" . pods_sanitize_like($data_params['query']) . "%'"; $lookup_where['user_email'] = "`t`.`user_email` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"; } elseif ($wpdb->posts == $search_data->table) { $lookup_where['post_title'] = "`t`.`post_title` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"; $lookup_where['post_name'] = "`t`.`post_name` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"; $lookup_where['post_content'] = "`t`.`post_content` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"; $lookup_where['post_excerpt'] = "`t`.`post_excerpt` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"; } elseif ($wpdb->terms == $search_data->table) { $lookup_where['name'] = "`t`.`name` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"; $lookup_where['slug'] = "`t`.`slug` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"; } elseif ($wpdb->comments == $search_data->table) { $lookup_where['comment_content'] = "`t`.`comment_content` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"; $lookup_where['comment_author'] = "`t`.`comment_author` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"; $lookup_where['comment_author_email'] = "`t`.`comment_author_email` LIKE '%" . pods_sanitize_like($data_params['query']) . "%'"; } $lookup_where = apply_filters('pods_form_ui_field_pick_autocomplete_lookup', $lookup_where, $data_params['query'], $name, $value, $options, $pod, $id, $object_params, $search_data); if (!empty($lookup_where)) { $params['where'][] = implode(' OR ', $lookup_where); } $orderby = array(); $orderby[] = "(`t`.`{$search_data->field_index}` LIKE '%" . pods_sanitize_like($data_params['query']) . "%' ) DESC"; $pick_orderby = pods_var_raw(self::$type . '_orderby', $options, null, null, true); if (0 < strlen($pick_orderby)) { $orderby[] = $pick_orderby; } $orderby[] = "`t`.`{$search_data->field_index}`"; $orderby[] = "`t`.`{$search_data->field_id}`"; $params['orderby'] = $orderby; } } elseif (0 < $limit) { $params['limit'] = $limit; $params['page'] = $page; } $extra = ''; if ($wpdb->posts == $search_data->table) { $extra = ', `t`.`post_type`'; } elseif ($wpdb->terms == $search_data->table) { $extra = ', `tt`.`taxonomy`'; } elseif ($wpdb->comments == $search_data->table) { $extra = ', `t`.`comment_type`'; } $params['select'] .= $extra; if ('user' == pods_var(self::$type . '_object', $options)) { $roles = pods_var(self::$type . '_user_role', $options); if (!empty($roles)) { $where = array(); foreach ((array) $roles as $role) { if (empty($role) || pods_clean_name($role) != $role && sanitize_title($role) != $role) { continue; } $where[] = $wpdb->base_prefix . (is_multisite() && !is_main_site() ? get_current_blog_id() . '_' : '') . 'capabilities.meta_value LIKE "%\\"' . pods_sanitize_like($role) . '\\"%"'; } if (!empty($where)) { $params['where'][] = implode(' OR ', $where); } } } $results = $search_data->select($params); if ($autocomplete && $params['limit'] < $search_data->total_found()) { if (!empty($value)) { $ids = $value; if (is_array($ids) && isset($ids[0]) && is_array($ids[0])) { $ids = wp_list_pluck($ids, $search_data->field_id); } if (is_array($ids)) { $ids = implode(', ', $ids); } if (is_array($params['where'])) { $params['where'] = implode(' AND ', $params['where']); } if (!empty($params['where'])) { $params['where'] .= ' AND '; } $params['where'] .= "`t`.`{$search_data->field_id}` IN ( " . $ids . " )"; $results = $search_data->select($params); } } else { $autocomplete = false; } if ('data' == $context) { self::$field_data = array('field' => $name, 'id' => $options['id'], 'autocomplete' => $autocomplete); } if ($hierarchy && !$autocomplete && !empty($results) && $options['table_info']['object_hierarchical'] && !empty($options['table_info']['field_parent'])) { $args = array('id' => $options['table_info']['field_id'], 'index' => $options['table_info']['field_index'], 'parent' => $options['table_info']['field_parent']); $results = pods_hierarchical_select($results, $args); } $ids = array(); if (!empty($results)) { $display_filter = pods_var('display_filter', pods_var_raw('options', pods_var_raw($search_data->field_index, $search_data->pod_data['object_fields']))); foreach ($results as $result) { $result = get_object_vars($result); if (!isset($result[$search_data->field_id]) || !isset($result[$search_data->field_index])) { continue; } $result[$search_data->field_index] = trim($result[$search_data->field_index]); $object = $object_type = ''; if ($wpdb->posts == $search_data->table && isset($result['post_type'])) { $object = $result['post_type']; $object_type = 'post_type'; } elseif ($wpdb->terms == $search_data->table && isset($result['taxonomy'])) { $object = $result['taxonomy']; $object_type = 'taxonomy'; } // WPML integration for Post Types and Taxonomies if (is_object($sitepress) && in_array($object_type, array('post_type', 'taxonomy'))) { $translated = false; if ('post_type' == $object_type && $sitepress->is_translated_post_type($object)) { $translated = true; } elseif ('taxonomy' == $object_type && $sitepress->is_translated_taxonomy($object)) { $translated = true; } if ($translated) { $object_id = icl_object_id($result[$search_data->field_id], $object, false, $current_language); if (0 < $object_id && !in_array($object_id, $ids)) { $text = $result[$search_data->field_index]; if ($result[$search_data->field_id] != $object_id) { if ($wpdb->posts == $search_data->table) { $text = trim(get_the_title($object_id)); } elseif ($wpdb->terms == $search_data->table) { $text = trim(get_term($object_id, $object)->name); } } $result[$search_data->field_id] = $object_id; $result[$search_data->field_index] = $text; } else { continue; } } } elseif (is_object($polylang) && in_array($object_type, array('post_type', 'taxonomy')) && method_exists($polylang, 'get_translation')) { $translated = false; if ('post_type' == $object_type && pll_is_translated_post_type($object)) { $translated = true; } elseif ('taxonomy' == $object_type && pll_is_translated_taxonomy($object)) { $translated = true; } if ($translated) { $object_id = $polylang->get_translation($object, $result[$search_data->field_id], $current_language); if (0 < $object_id && !in_array($object_id, $ids)) { $text = $result[$search_data->field_index]; if ($result[$search_data->field_id] != $object_id) { if ($wpdb->posts == $search_data->table) { $text = trim(get_the_title($object_id)); } elseif ($wpdb->terms == $search_data->table) { $text = trim(get_term($object_id, $object)->name); } } $result[$search_data->field_id] = $object_id; $result[$search_data->field_index] = $text; } else { continue; } } } if (0 < strlen($display_filter)) { $display_filter_args = pods_var('display_filter_args', pods_var_raw('options', pods_var_raw($search_data->field_index, $search_data->pod_data['object_fields']))); $args = array($display_filter, $result[$search_data->field_index]); if (!empty($display_filter_args)) { foreach ((array) $display_filter_args as $display_filter_arg) { if (isset($result[$display_filter_arg])) { $args[] = $result[$display_filter_arg]; } } } $result[$search_data->field_index] = call_user_func_array('apply_filters', $args); } if (in_array($options[self::$type . '_object'], array('site', 'network'))) { $result[$search_data->field_index] = $result[$search_data->field_index] . $result['path']; } elseif (strlen($result[$search_data->field_index]) < 1) { $result[$search_data->field_index] = '(No Title)'; } if ('admin_ajax_relationship' == $context) { $items[] = array('id' => $result[$search_data->field_id], 'text' => $result[$search_data->field_index], 'image' => ''); } else { $data[$result[$search_data->field_id]] = $result[$search_data->field_index]; } $ids[] = $result[$search_data->field_id]; } } } if ($simple && 'admin_ajax_relationship' == $context) { $found_data = array(); foreach ($data as $k => $v) { if (false !== stripos($v, $data_params['query']) || false !== stripos($k, $data_params['query'])) { $found_data[$k] = $v; } } $data = $found_data; } } if ('admin_ajax_relationship' == $context) { if (empty($items) && !empty($data)) { foreach ($data as $k => $v) { $items[] = array('id' => $k, 'text' => $v, 'image' => ''); } } return $items; } return $data; }
/** * @param $options * * @return array|bool|mixed|null|PodsArray */ public function setup($options) { $options = pods_array($options); $options->validate('num', '', 'absint'); if (empty($options->num)) { $options->num = ''; } $options->validate('id', pods_var('id' . $options->num, 'get', $this->id)); $options->validate('do', pods_var('do' . $options->num, 'get', $this->do), 'in_array', array('save', 'create')); $options->validate('excluded', self::$excluded, 'array_merge'); $options->validate('action', pods_var('action' . $options->num, 'get', $this->action, null, true), 'in_array', $this->actions); $options->validate('actions_bulk', $this->actions_bulk, 'array_merge'); $options->validate('action_bulk', pods_var('action_bulk' . $options->num, 'get', $this->action_bulk, null, true), 'isset', $this->actions_bulk); $bulk = pods_var('action_bulk_ids' . $options->num, 'get', array(), null, true); if (!empty($bulk)) { $bulk = (array) pods_var('action_bulk_ids' . $options->num, 'get', array(), null, true); } else { $bulk = array(); } $options->validate('bulk', $bulk, 'array_merge', $this->bulk); $options->validate('views', $this->views, 'array'); $options->validate('view', pods_var('view' . $options->num, 'get', $this->view, null, true), 'isset', $this->views); $options->validate('searchable', $this->searchable, 'boolean'); $options->validate('search', pods_var('search' . $options->num, 'get')); $options->validate('search_across', $this->search_across, 'boolean'); $options->validate('search_across_picks', $this->search_across_picks, 'boolean'); $options->validate('filters', $this->filters, 'array'); $options->validate('filters_enhanced', $this->filters_enhanced, 'boolean'); $options->validate('where', $this->where, 'array_merge'); $options->validate('pagination', $this->pagination, 'boolean'); $options->validate('page', pods_var('pg' . $options->num, 'get', $this->page), 'absint'); $options->validate('limit', pods_var('limit' . $options->num, 'get', $this->limit), 'int'); if (isset($this->pods_data) && is_object($this->pods_data)) { $this->sql = array('table' => $this->pods_data->table, 'field_id' => $this->pods_data->field_id, 'field_index' => $this->pods_data->field_index); } $options->validate('sql', $this->sql, 'array_merge'); $options->validate('orderby_dir', strtoupper(pods_v('orderby_dir' . $options['num'], 'get', $this->orderby_dir, true)), 'in_array', array('ASC', 'DESC')); $orderby = $this->orderby; // Enforce strict DB column name usage if (!empty($_GET['orderby' . $options->num])) { $orderby = pods_clean_name($_GET['orderby' . $options->num], true, false); } if (!empty($orderby)) { $orderby = array('default' => $orderby); } else { $orderby = array(); } $options->validate('orderby', $orderby, 'array_merge'); $options->validate('sortable', $this->sortable, 'boolean'); $options->validate('params', $this->params, 'array'); $options->validate('restrict', $this->restrict, 'array_merge'); // handle author restrictions if (!empty($options['restrict']['author_restrict'])) { $restrict = $options['restrict']; if (!is_array($restrict['author_restrict'])) { $restrict['author_restrict'] = array($restrict['author_restrict'] => get_current_user_id()); } if (null === $restrict['edit']) { $restrict['edit'] = $restrict['author_restrict']; } $options->restrict = $restrict; } if (null !== $options['restrict']['edit']) { $restrict = $options['restrict']; if (null === $restrict['duplicate']) { $restrict['duplicate'] = $restrict['edit']; } if (null === $restrict['delete']) { $restrict['delete'] = $restrict['edit']; } if (null === $restrict['manage']) { $restrict['manage'] = $restrict['edit']; } if (null === $restrict['reorder']) { $restrict['reorder'] = $restrict['edit']; } $options->restrict = $restrict; } $item = __('Item', 'pods'); $items = __('Items', 'pods'); if (is_object($this->pod)) { $item = pods_var_raw('label_singular', $this->pod->pod_data['options'], pods_var_raw('label', $this->pod->pod_data, $item, null, true), null, true); $items = pods_var_raw('label', $this->pod->pod_data, $items, null, true); } $options->validate('item', $item); $options->validate('items', $items); $options->validate('heading', array('manage' => __('Manage', 'pods'), 'add' => __('Add New', 'pods'), 'edit' => __('Edit', 'pods'), 'duplicate' => __('Duplicate', 'pods'), 'view' => __('View', 'pods'), 'reorder' => __('Reorder', 'pods'), 'search' => __('Search', 'pods'), 'views' => __('View', 'pods')), 'array_merge'); $options->validate('header', array('manage' => sprintf(__('Manage %s', 'pods'), $options->items), 'add' => sprintf(__('Add New %s', 'pods'), $options->item), 'edit' => sprintf(__('Edit %s', 'pods'), $options->item), 'duplicate' => sprintf(__('Duplicate %s', 'pods'), $options->item), 'view' => sprintf(__('View %s', 'pods'), $options->item), 'reorder' => sprintf(__('Reorder %s', 'pods'), $options->items), 'search' => sprintf(__('Search %s', 'pods'), $options->items)), 'array_merge'); $options->validate('label', array('add' => sprintf(__('Save New %s', 'pods'), $options->item), 'add_new' => __('Add New', 'pods'), 'edit' => sprintf(__('Save %s', 'pods'), $options->item), 'duplicate' => sprintf(__('Save New %s', 'pods'), $options->item), 'delete' => sprintf(__('Delete this %s', 'pods'), $options->item), 'view' => sprintf(__('View %s', 'pods'), $options->item), 'reorder' => sprintf(__('Reorder %s', 'pods'), $options->items)), 'array_merge'); $options->validate('fields', array('manage' => array($options->sql['field_index'] => array('label' => __('Name', 'pods')))), 'array'); $options->validate('export', $this->export, 'array_merge'); $options->validate('reorder', $this->reorder, 'array_merge'); $options->validate('screen_options', $this->screen_options, 'array_merge'); $options->validate('session', $this->session, 'in_array', array('search', 'filters', 'show_per_page', 'orderby')); $options->validate('user', $this->user, 'in_array', array('search', 'filters', 'show_per_page', 'orderby')); $options->validate('action_after', $this->action_after, 'array_merge'); $options->validate('action_links', $this->action_links, 'array_merge'); $options->validate('actions_disabled', $this->actions_disabled, 'array'); $options->validate('actions_hidden', $this->actions_hidden, 'array_merge'); $options->validate('actions_custom', $this->actions_custom, 'array_merge'); if (!empty($options->actions_disabled)) { if (!empty($options->actions_bulk)) { $actions_bulk = $options->actions_bulk; foreach ($actions_bulk as $action => $action_opt) { if (in_array($action, $options->actions_disabled)) { unset($actions_bulk[$action]); } } $options->actions_bulk = $actions_bulk; } if (!empty($options->actions_custom)) { $actions_custom = $options->actions_custom; foreach ($actions_custom as $action => $action_opt) { if (in_array($action, $options->actions_disabled)) { unset($actions_custom[$action]); } } $options->actions_custom = $actions_custom; } } $options->validate('extra', $this->extra, 'array_merge'); $options->validate('style', $this->style); $options->validate('icon', $this->icon); $options->validate('css', $this->css); $options->validate('wpcss', $this->wpcss, 'boolean'); if (true === $options['wpcss']) { global $user_ID; get_currentuserinfo(); $color = get_user_meta($user_ID, 'admin_color', true); if (strlen($color) < 1) { $color = 'fresh'; } $this->wpcss = "colors-{$color}"; } $options = $options->dump(); if (is_object($this->pod)) { $options = $this->do_hook($this->pod->pod . '_setup_options', $options); } $options = $this->do_hook('setup_options', $options); if (false !== $options && !empty($options)) { foreach ($options as $option => $value) { if (isset($this->{$option})) { $this->{$option} = $value; } else { $this->x[$option] = $value; } } } $unique_identifier = pods_var('page', 'get'); // wp-admin page if (is_object($this->pod) && isset($this->pod->pod)) { $unique_identifier = '_' . $this->pod->pod; } elseif (0 < strlen($this->sql['table'])) { $unique_identifier = '_' . $this->sql['table']; } $unique_identifier .= '_' . $this->page; if (0 < strlen($this->num)) { $unique_identifier .= '_' . $this->num; } $this->unique_identifier = 'pods_ui_' . md5($unique_identifier); $this->setup_fields(); return $options; }
/** * Return a lowercase alphanumeric name (with underscores) for safe Javascript variable names * * @param string $orig Input string to clean * @param boolean $lower Force lowercase * * @return string Sanitized name * * @since 2.5.3 */ function pods_js_name($orig, $lower = true) { $str = pods_clean_name($orig, $lower); $str = str_replace('-', '_', $str); return $str; }
/** * @param $params * * @return mixed|string|void */ public function migrate_pod($params) { /** * @var $wpdb WPDB */ global $wpdb; if (!isset($params->pod)) { return pods_error(__('Invalid Pod.', 'pods')); } $pod = pods_sanitize(pods_clean_name($params->pod)); if (!in_array("{$wpdb->prefix}pod_tbl_{$pod}", $this->tables)) { return pods_error(__('Table not found, items cannot be migrated', 'pods')); } if (!in_array("{$wpdb->prefix}pods_{$pod}", $this->tables)) { return pods_error(__('New table not found, items cannot be migrated', 'pods')); } if (!in_array("{$wpdb->prefix}pod_types", $this->tables)) { return pods_error(__('Pod Types table not found, items cannot be migrated', 'pods')); } if (!in_array("{$wpdb->prefix}pod", $this->tables)) { return pods_error(__('Pod table not found, items cannot be migrated', 'pods')); } if (true === $this->check_progress(__FUNCTION__, $pod)) { return '1'; } $pod_data = $this->api->load_pod(array('name' => $pod), false); if (empty($pod_data)) { return pods_error(sprintf(__('Pod <strong>%s</strong> not found, items cannot be migrated', 'pods'), $pod)); } $columns = array(); $old_columns = array(); foreach ($pod_data['fields'] as $field) { if (!in_array($field['name'], array('created', 'modified', 'author')) && !in_array($field['type'], array('file', 'pick'))) { $columns[] = pods_sanitize($field['name']); $old_columns[] = pods_var('_pods_1x_field_name', $field['options'], $field['name'], null, false); } } $into = '`id`'; $select = '`t`.`id`'; if (!empty($columns)) { $into .= ', `' . implode('`, `', $columns) . '`'; $select .= ', `t`.`' . implode('`, `t`.`', $old_columns) . '`'; } // Copy content from the old table into the new $sql = "\n REPLACE INTO `@wp_pods_{$pod}`\n ( {$into} )\n ( SELECT {$select}\n FROM `@wp_pod_tbl_{$pod}` AS `t` )\n "; pods_query($sql); // Copy index data from the old index table into the new individual table $sql = "\n UPDATE `@wp_pods_{$pod}` AS `t`\n LEFT JOIN `@wp_pod_types` AS `x` ON `x`.`name` = '{$pod}'\n LEFT JOIN `@wp_pod` AS `p` ON `p`.`datatype` = `x`.`id` AND `p`.`tbl_row_id` = `t`.`id`\n SET `t`.`created` = `p`.`created`, `t`.`modified` = `p`.`modified`\n WHERE `x`.`id` IS NOT NULL AND `p`.`id` IS NOT NULL\n "; pods_query($sql); // Copy name data from the old index table into the new individual table (if name empty in indiv table) $sql = "\n UPDATE `@wp_pods_{$pod}` AS `t`\n LEFT JOIN `@wp_pod_types` AS `x` ON `x`.`name` = '{$pod}'\n LEFT JOIN `@wp_pod` AS `p` ON `p`.`datatype` = `x`.`id` AND `p`.`tbl_row_id` = `t`.`id`\n SET `t`.`name` = `p`.`name`\n WHERE ( `t`.`name` IS NULL OR `t`.`name` = '' ) AND `x`.`id` IS NOT NULL AND `p`.`id` IS NOT NULL\n "; pods_query($sql); $this->update_progress(__FUNCTION__, true, $pod); return '1'; }
/** * Import a Package * * @param string|array $data a JSON array package string, or an array of Package Data * @param bool $replace Whether to replace existing pods entirely or just update them * * @return array|bool * * @static * @since 2.0.5 */ public static function import($data, $replace = false) { if (!defined('PODS_FIELD_STRICT')) { define('PODS_FIELD_STRICT', false); } if (!is_array($data)) { $json_data = @json_decode($data, true); if (!is_array($json_data)) { $json_data = @json_decode(pods_unslash($data), true); } $data = $json_data; } if (!is_array($data) || empty($data)) { return false; } $api = pods_api(); if (!isset($data['meta']) || !isset($data['meta']['version']) || empty($data['meta']['version'])) { return false; } // Pods 1.x < 1.10 if (false === strpos($data['meta']['version'], '.') && (int) $data['meta']['version'] < 1000) { $data['meta']['version'] = implode('.', str_split($data['meta']['version'])); } elseif (false === strpos($data['meta']['version'], '.')) { $data['meta']['version'] = pods_version_to_point($data['meta']['version']); } $found = array(); if (isset($data['pods']) && is_array($data['pods'])) { foreach ($data['pods'] as $pod_data) { if (isset($pod_data['id'])) { unset($pod_data['id']); } $pod = $api->load_pod(array('name' => $pod_data['name']), false); $existing_fields = array(); if (!empty($pod)) { // Delete Pod if it exists if ($replace) { $api->delete_pod(array('id' => $pod['id'])); $pod = array('fields' => array()); } else { $existing_fields = $pod['fields']; } } else { $pod = array('fields' => array()); } // Backwards compatibility if (version_compare($data['meta']['version'], '2.0', '<')) { $core_fields = array(array('name' => 'created', 'label' => 'Date Created', 'type' => 'datetime', 'options' => array('datetime_format' => 'ymd_slash', 'datetime_time_type' => '12', 'datetime_time_format' => 'h_mm_ss_A'), 'weight' => 1), array('name' => 'modified', 'label' => 'Date Modified', 'type' => 'datetime', 'options' => array('datetime_format' => 'ymd_slash', 'datetime_time_type' => '12', 'datetime_time_format' => 'h_mm_ss_A'), 'weight' => 2), array('name' => 'author', 'label' => 'Author', 'type' => 'pick', 'pick_object' => 'user', 'options' => array('pick_format_type' => 'single', 'pick_format_single' => 'autocomplete', 'default_value' => '{@user.ID}'), 'weight' => 3)); $found_fields = array(); if (!empty($pod_data['fields'])) { foreach ($pod_data['fields'] as $k => $field) { $field_type = $field['coltype']; if ('txt' == $field_type) { $field_type = 'text'; } elseif ('desc' == $field_type) { $field_type = 'wysiwyg'; } elseif ('code' == $field_type) { $field_type = 'paragraph'; } elseif ('bool' == $field_type) { $field_type = 'boolean'; } elseif ('num' == $field_type) { $field_type = 'number'; } elseif ('date' == $field_type) { $field_type = 'datetime'; } $multiple = min(max((int) $field['multiple'], 0), 1); $new_field = array('name' => trim($field['name']), 'label' => trim($field['label']), 'description' => trim($field['comment']), 'type' => $field_type, 'weight' => (int) $field['weight'], 'options' => array('required' => min(max((int) $field['required'], 0), 1), 'unique' => min(max((int) $field['unique'], 0), 1), 'input_helper' => $field['input_helper'])); if (in_array($new_field['name'], $found_fields)) { unset($pod_data['fields'][$k]); continue; } $found_fields[] = $new_field['name']; if ('pick' == $field_type) { $new_field['pick_object'] = 'pod'; $new_field['pick_val'] = $field['pickval']; if ('wp_user' == $field['pickval']) { $new_field['pick_object'] = 'user'; } elseif ('wp_post' == $field['pickval']) { $new_field['pick_object'] = 'post_type-post'; } elseif ('wp_page' == $field['pickval']) { $new_field['pick_object'] = 'post_type-page'; } elseif ('wp_taxonomy' == $field['pickval']) { $new_field['pick_object'] = 'taxonomy-category'; } // This won't work if the field doesn't exist // $new_field[ 'sister_id' ] = $field[ 'sister_field_id' ]; $new_field['options']['pick_filter'] = $field['pick_filter']; $new_field['options']['pick_orderby'] = $field['pick_orderby']; $new_field['options']['pick_display'] = ''; $new_field['options']['pick_size'] = 'medium'; if (1 == $multiple) { $new_field['options']['pick_format_type'] = 'multi'; $new_field['options']['pick_format_multi'] = 'checkbox'; $new_field['options']['pick_limit'] = 0; } else { $new_field['options']['pick_format_type'] = 'single'; $new_field['options']['pick_format_single'] = 'dropdown'; $new_field['options']['pick_limit'] = 1; } } elseif ('file' == $field_type) { $new_field['options']['file_format_type'] = 'multi'; $new_field['options']['file_type'] = 'any'; } elseif ('number' == $field_type) { $new_field['options']['number_decimals'] = 2; } elseif ('desc' == $field['coltype']) { $new_field['options']['wysiwyg_editor'] = 'tinymce'; } elseif ('text' == $field_type) { $new_field['options']['text_max_length'] = 128; } if (isset($pod['fields'][$new_field['name']])) { $new_field = array_merge($pod['fields'][$new_field['name']], $new_field); } $pod_data['fields'][$k] = $new_field; } } if (pods_var('id', $pod, 0) < 1) { $pod_data['fields'] = array_merge($core_fields, $pod_data['fields']); } if (empty($pod_data['label'])) { $pod_data['label'] = ucwords(str_replace('_', ' ', $pod_data['name'])); } if (isset($pod_data['is_toplevel'])) { $pod_data['show_in_menu'] = 1 == $pod_data['is_toplevel'] ? 1 : 0; unset($pod_data['is_toplevel']); } if (isset($pod_data['detail_page'])) { $pod_data['detail_url'] = $pod_data['detail_page']; unset($pod_data['detail_page']); } if (isset($pod_data['before_helpers'])) { $pod_data['pre_save_helpers'] = $pod_data['before_helpers']; unset($pod_data['before_helpers']); } if (isset($pod_data['after_helpers'])) { $pod_data['post_save_helpers'] = $pod_data['after_helpers']; unset($pod_data['after_helpers']); } if (isset($pod_data['pre_drop_helpers'])) { $pod_data['pre_delete_helpers'] = $pod_data['pre_drop_helpers']; unset($pod_data['pre_drop_helpers']); } if (isset($pod_data['post_drop_helpers'])) { $pod_data['post_delete_helpers'] = $pod_data['post_drop_helpers']; unset($pod_data['post_drop_helpers']); } $pod_data['name'] = pods_clean_name($pod_data['name']); $pod_data = array('name' => $pod_data['name'], 'label' => $pod_data['label'], 'type' => 'pod', 'storage' => 'table', 'fields' => $pod_data['fields'], 'options' => array('pre_save_helpers' => pods_var_raw('pre_save_helpers', $pod_data), 'post_save_helpers' => pods_var_raw('post_save_helpers', $pod_data), 'pre_delete_helpers' => pods_var_raw('pre_delete_helpers', $pod_data), 'post_delete_helpers' => pods_var_raw('post_delete_helpers', $pod_data), 'show_in_menu' => 1 == pods_var_raw('show_in_menu', $pod_data, 0) ? 1 : 0, 'detail_url' => pods_var_raw('detail_url', $pod_data), 'pod_index' => 'name')); } $pod = array_merge($pod, $pod_data); foreach ($pod['fields'] as $k => $field) { if (isset($field['id']) && !isset($existing_fields[$field['name']])) { unset($pod['fields'][$k]['id']); } if (isset($field['pod_id'])) { unset($pod['fields'][$k]['pod_id']); } if (isset($existing_fields[$field['name']])) { if ($existing_field = pods_api()->load_field(array('name' => $field['name'], 'pod' => $pod['name']))) { $pod['fields'][$k]['id'] = $existing_field['id']; } } if (isset($field['pod'])) { unset($pod['fields'][$k]['pod']); } } $api->save_pod($pod); if (!isset($found['pods'])) { $found['pods'] = array(); } $found['pods'][$pod['name']] = $pod['label']; } } if (isset($data['templates']) && is_array($data['templates'])) { foreach ($data['templates'] as $template_data) { if (isset($template_data['id'])) { unset($template_data['id']); } $template = $api->load_template(array('name' => $template_data['name'])); if (!empty($template)) { // Delete Template if it exists if ($replace) { $api->delete_template(array('id' => $template['id'])); $template = array(); } } else { $template = array(); } $template = array_merge($template, $template_data); $api->save_template($template); if (!isset($found['templates'])) { $found['templates'] = array(); } $found['templates'][$template['name']] = $template['name']; } } // Backwards compatibility if (isset($data['pod_pages'])) { $data['pages'] = $data['pod_pages']; unset($data['pod_pages']); } if (isset($data['pages']) && is_array($data['pages'])) { foreach ($data['pages'] as $page_data) { if (isset($page_data['id'])) { unset($page_data['id']); } $page = $api->load_page(array('name' => pods_var_raw('name', $page_data, pods_var_raw('uri', $page_data), null, true))); if (!empty($page)) { // Delete Page if it exists if ($replace) { $api->delete_page(array('id' => $page['id'])); $page = array(); } } else { $page = array(); } // Backwards compatibility if (isset($page_data['uri'])) { $page_data['name'] = $page_data['uri']; unset($page_data['uri']); } if (isset($page_data['phpcode'])) { $page_data['code'] = $page_data['phpcode']; unset($page_data['phpcode']); } $page = array_merge($page, $page_data); $page['name'] = trim($page['name'], '/'); $api->save_page($page); if (!isset($found['pages'])) { $found['pages'] = array(); } $found['pages'][$page['name']] = $page['name']; } } if (isset($data['helpers']) && is_array($data['helpers'])) { foreach ($data['helpers'] as $helper_data) { if (isset($helper_data['id'])) { unset($helper_data['id']); } $helper = $api->load_helper(array('name' => $helper_data['name'])); if (!empty($helper)) { // Delete Helper if it exists if ($replace) { $api->delete_helper(array('id' => $helper['id'])); $helper = array(); } } else { $helper = array(); } // Backwards compatibility if (isset($helper_data['phpcode'])) { $helper_data['code'] = $helper_data['phpcode']; unset($helper_data['phpcode']); } if (isset($helper_data['type'])) { if ('before' == $helper_data['type']) { $helper_data['type'] = 'pre_save'; } elseif ('after' == $helper_data['type']) { $helper_data['type'] = 'post_save'; } } $helper = array_merge($helper, $helper_data); if (isset($helper['type'])) { $helper['helper_type'] = $helper['type']; unset($helper['helper_type']); } $api->save_helper($helper); if (!isset($found['helpers'])) { $found['helpers'] = array(); } $found['helpers'][$helper['name']] = $helper['name']; } } $found = apply_filters('pods_packages_import', $found, $data, $replace); if (!empty($found)) { return $found; } return false; }
public function build_xml_level($item, $column, $level = 2, $column_name = '') { $column = pods_clean_name($column, false, false); $line = ''; $value = ''; if (is_object($item)) { if (!isset($item->{$column})) { $item->{$column} = ''; } $value = $item->{$column}; } elseif (is_array($item)) { if (!isset($item[$column])) { $item[$column] = ''; } $value = $item[$column]; } if (!empty($column_name)) { $column = $column_name; } $tabs = str_repeat("\t", $level); $line .= $tabs . "<{$column}>"; if (is_array($value) || is_object($value)) { if (is_object($value)) { $value = get_object_vars($value); } foreach ($value as $k => $v) { if (is_int($k)) { $line .= $this->build_xml_level($value, $k, $level + 1, 'value'); } else { $line .= $this->build_xml_level($value, $k, $level + 1); } } } elseif (false !== strpos($value, '<')) { $value = str_replace(array('<![CDATA[', ']]>'), array('<![CDATA[', ']]>'), $value); $line .= "<![CDATA[" . $value . "]]>"; } else { $line .= $value; } $line .= "</{$column}>\r\n"; return $line; }
/** * * * @since 2.0 */ private function migrate_taxonomy($taxonomy) { $params = array('type' => 'taxonomy', 'storage' => 'table', 'object' => '', 'name' => pods_var_raw('name', $taxonomy), 'label' => pods_var_raw('label', $taxonomy), 'label_singular' => pods_var_raw('singular_label', $taxonomy), 'public' => 1, 'show_ui' => (int) pods_var_raw('show_ui', $taxonomy), 'hierarchical' => (int) pods_var_raw('hierarchical', $taxonomy), 'query_var' => (int) pods_var_raw('query_var', $taxonomy), 'rewrite' => (int) pods_var_raw('rewrite', $taxonomy), 'rewrite_custom_slug' => pods_var_raw('rewrite_slug', $taxonomy), 'label_search_items' => pods_var_raw('search_items', $taxonomy[0]), 'label_popular_items' => pods_var_raw('popular_items', $taxonomy[0]), 'label_all_items' => pods_var_raw('all_items', $taxonomy[0]), 'label_parent' => pods_var_raw('parent_item', $taxonomy[0]), 'label_parent_item_colon' => pods_var_raw('parent_item_colon', $taxonomy[0]), 'label_edit' => pods_var_raw('edit_item', $taxonomy[0]), 'label_update_item' => pods_var_raw('update_item', $taxonomy[0]), 'label_add_new' => pods_var_raw('add_new_item', $taxonomy[0]), 'label_new_item' => pods_var_raw('new_item_name', $taxonomy[0]), 'label_separate_items_with_commas' => pods_var_raw('separate_items_with_commas', $taxonomy[0]), 'label_add_or_remove_items' => pods_var_raw('add_or_remove_items', $taxonomy[0]), 'label_choose_from_the_most_used' => pods_var_raw('choose_from_most_used', $taxonomy[0])); // Migrate attach-to $attach = $taxonomy[1]; if (is_array($attach)) { foreach ($attach as $type_name) { $params['built_in_post_types_' . $type_name] = 1; } } if (!is_object($this->api)) { $this->api = pods_api(); } $pod = $this->api->load_pod(array('name' => pods_clean_name($params['name'])), false); if (!empty($pod)) { return pods_error(sprintf(__('Pod with the name %s already exists', 'pods'), pods_clean_name($params['name']))); } $id = (int) $this->api->save_pod($params); if (empty($id)) { return false; } $pod = $this->api->load_pod(array('id' => $id), false); if (empty($pod)) { return false; } if ($pod['name'] != $params['name']) { $this->api->rename_wp_object($params['type '], $params['name'], $pod['name']); } return $id; }
/** * Get information about an objects MySQL table * * @param string $object_type * @param string $object The object to look for * @param null $name (optional) Name of the pod to load * @param array $pod (optional) Array with pod information * @param array $field (optional) Array with field information * * @return array|bool * * @since 2.0 */ public function get_table_info($object_type, $object, $name = null, $pod = null, $field = null) { /** * @var $wpdb wpdb * @var $sitepress SitePress * @var $icl_adjust_id_url_filter_off boolean */ global $wpdb, $sitepress, $icl_adjust_id_url_filter_off, $polylang; // @todo Handle $object arrays for Post Types, Taxonomies, Comments (table pulled from first object in array) $info = array('object_type' => $object_type, 'type' => null, 'object_name' => $object, 'object_hierarchical' => false, 'table' => $object, 'meta_table' => $object, 'pod_table' => $wpdb->prefix . 'pods_' . (empty($object) ? $name : $object), 'field_id' => 'id', 'field_index' => 'name', 'field_slug' => null, 'field_type' => null, 'field_parent' => null, 'field_parent_select' => null, 'meta_field_id' => 'id', 'meta_field_index' => 'name', 'meta_field_value' => 'name', 'pod_field_id' => 'id', 'pod_field_index' => 'name', 'pod_field_slug' => null, 'pod_field_parent' => null, 'join' => array(), 'where' => null, 'where_default' => null, 'orderby' => null, 'pod' => null, 'recurse' => false); if (empty($object_type)) { $object_type = 'post_type'; $object = 'post'; } $pod_name = $pod; if (is_array($pod_name)) { $pod_name = pods_var_raw('name', $pod_name, version_compare(PHP_VERSION, '5.4.0', '>=') ? json_encode($pod_name, JSON_UNESCAPED_UNICODE) : json_encode($pod_name), null, true); } $field_name = $field; if (is_array($field_name)) { $field_name = pods_var_raw('name', $field_name, version_compare(PHP_VERSION, '5.4.0', '>=') ? json_encode($pod_name, JSON_UNESCAPED_UNICODE) : json_encode($field_name), null, true); } $transient = 'pods_get_table_info_' . md5($object_type . '_object_' . $object . '_name_' . $name . '_pod_' . $pod_name . '_field_' . $field_name); $current_language = false; $current_language_t_id = $current_language_tt_id = 0; // WPML support if (is_object($sitepress) && !$icl_adjust_id_url_filter_off) { $current_language = pods_sanitize(ICL_LANGUAGE_CODE); } elseif (is_object($polylang) && function_exists('pll_current_language')) { $current_language = pods_sanitize(pll_current_language('slug')); if (!empty($current_language)) { $current_language_t_id = (int) $polylang->get_language($current_language)->term_id; $current_language_tt_id = (int) $polylang->get_language($current_language)->term_taxonomy_id; } } if (!empty($current_language)) { $transient = 'pods_get_table_info_' . $current_language . '_' . md5($object_type . '_object_' . $object . '_name_' . $name . '_pod_' . $pod_name . '_field_' . $field_name); } $_info = false; if (pods_api_cache()) { $_info = pods_transient_get($transient); } if (pods_api_cache() && false === $_info && !did_action('init')) { $_info = pods_transient_get($transient . '_pre_init'); } if (false !== $_info) { $info = $_info; } else { if ('pod' == $object_type && null === $pod) { if (empty($name)) { $prefix = 'pod-'; // Make sure we actually have the prefix before trying anything with the name if (0 === strpos($object_type, $prefix)) { $name = substr($object_type, strlen($prefix), strlen($object_type)); } } if (empty($name) && !empty($object)) { $name = $object; } $pod = $this->load_pod(array('name' => $name, 'table_info' => false), false); if (!empty($pod)) { $object_type = $pod['type']; $name = $pod['name']; $object = $pod['object']; $info['pod'] = $pod; } } elseif (null === $pod) { if (empty($name)) { $prefix = $object_type . '-'; // Make sure we actually have the prefix before trying anything with the name if (0 === strpos($object_type, $prefix)) { $name = substr($object_type, strlen($prefix), strlen($object_type)); } } if (empty($name) && !empty($object)) { $name = $object; } if (!empty($name)) { $pod = $this->load_pod(array('name' => $name, 'table_info' => false), false); if (!empty($pod) && (null === $object_type || $object_type == $pod['type'])) { $object_type = $pod['type']; $name = $pod['name']; $object = $pod['object']; $info['pod'] = $pod; } } } elseif (!empty($pod)) { $info['pod'] = $pod; } if (0 === strpos($object_type, 'pod')) { if (empty($name)) { $prefix = 'pod-'; // Make sure we actually have the prefix before trying anything with the name if (0 === strpos($object_type, $prefix)) { $name = substr($object_type, strlen($prefix), strlen($object_type)); } } $object_type = 'pod'; $info['table'] = $info['meta_table'] = $wpdb->prefix . 'pods_' . (empty($object) ? $name : $object); if (is_array($info['pod']) && 'pod' == pods_var('type', $info['pod'])) { $info['pod_field_index'] = $info['field_index'] = $info['meta_field_index'] = $info['meta_field_value'] = pods_var('pod_index', $info['pod']['options'], 'id', null, true); $slug_field = get_posts(array('post_type' => '_pods_field', 'posts_per_page' => 1, 'nopaging' => true, 'post_parent' => $info['pod']['id'], 'orderby' => 'menu_order', 'order' => 'ASC', 'meta_query' => array(array('key' => 'type', 'value' => 'slug')))); if (!empty($slug_field)) { $slug_field = $slug_field[0]; $info['field_slug'] = $info['pod_field_slug'] = $slug_field->post_name; } if (1 == pods_var('hierarchical', $info['pod']['options'], 0)) { $parent_field = pods_var('pod_parent', $info['pod']['options'], 'id', null, true); if (!empty($parent_field) && isset($info['pod']['fields'][$parent_field])) { $info['object_hierarchical'] = true; $info['pod_field_parent'] = $info['field_parent'] = $parent_field . '_select'; $info['field_parent_select'] = '`' . $parent_field . '`.`id` AS `' . $info['field_parent'] . '`'; } } } } if (0 === strpos($object_type, 'post_type') || 'media' == $object_type || in_array(pods_var_raw('type', $info['pod']), array('post_type', 'media'))) { $info['table'] = $wpdb->posts; $info['meta_table'] = $wpdb->postmeta; $info['field_id'] = 'ID'; $info['field_index'] = 'post_title'; $info['field_slug'] = 'post_name'; $info['field_type'] = 'post_type'; $info['field_parent'] = 'post_parent'; $info['field_parent_select'] = '`t`.`' . $info['field_parent'] . '`'; $info['meta_field_id'] = 'post_id'; $info['meta_field_index'] = 'meta_key'; $info['meta_field_value'] = 'meta_value'; if ('media' == $object_type) { $object = 'attachment'; } if (empty($name)) { $prefix = 'post_type-'; // Make sure we actually have the prefix before trying anything with the name if (0 === strpos($object_type, $prefix)) { $name = substr($object_type, strlen($prefix), strlen($object_type)); } } if ('media' != $object_type) { $object_type = 'post_type'; } $post_type = pods_sanitize(empty($object) ? $name : $object); if ('attachment' == $post_type || 'media' == $object_type) { $info['pod_table'] = $wpdb->prefix . 'pods_media'; } else { $info['pod_table'] = $wpdb->prefix . 'pods_' . pods_clean_name($post_type, true, false); } $post_type_object = get_post_type_object($post_type); if (is_object($post_type_object) && $post_type_object->hierarchical) { $info['object_hierarchical'] = true; } $post_stati = $this->do_hook('get_table_info_default_post_status', array('publish'), $post_type, $info, $object_type, $object, $name, $pod, $field); $info['where'] = array('post_type' => '`t`.`' . $info['field_type'] . '` = "' . $post_type . '"'); if ('post_type' == $object_type) { $info['where_default'] = '`t`.`post_status` IN ( "' . implode('", "', $post_stati) . '" )'; } $info['orderby'] = '`t`.`menu_order`, `t`.`' . $info['field_index'] . '`, `t`.`post_date`'; // WPML support if (is_object($sitepress) && $sitepress->is_translated_post_type($post_type) && !$icl_adjust_id_url_filter_off) { $info['join']['wpml_translations'] = "\n LEFT JOIN `{$wpdb->prefix}icl_translations` AS `wpml_translations`\n ON `wpml_translations`.`element_id` = `t`.`ID`\n AND `wpml_translations`.`element_type` = 'post_{$post_type}'\n AND `wpml_translations`.`language_code` = '{$current_language}'\n "; $info['join']['wpml_languages'] = "\n LEFT JOIN `{$wpdb->prefix}icl_languages` AS `wpml_languages`\n ON `wpml_languages`.`code` = `wpml_translations`.`language_code` AND `wpml_languages`.`active` = 1\n "; $info['where']['wpml_languages'] = "`wpml_languages`.`code` IS NOT NULL"; } elseif (is_object($polylang) && !empty($current_language) && function_exists('pll_is_translated_post_type') && pll_is_translated_post_type($post_type)) { $info['join']['polylang_languages'] = "\n LEFT JOIN `{$wpdb->term_relationships}` AS `polylang_languages`\n ON `polylang_languages`.`object_id` = `t`.`ID`\n AND `polylang_languages`.`term_taxonomy_id` = {$current_language_tt_id}\n "; $info['where']['polylang_languages'] = "`polylang_languages`.`object_id` IS NOT NULL"; } $info['object_fields'] = $this->get_wp_object_fields($object_type, $info['pod']); } elseif (0 === strpos($object_type, 'taxonomy') || in_array($object_type, array('nav_menu', 'post_format')) || 'taxonomy' == pods_var_raw('type', $info['pod'])) { $info['table'] = $info['meta_table'] = $wpdb->terms; $info['join']['tt'] = "LEFT JOIN `{$wpdb->term_taxonomy}` AS `tt` ON `tt`.`term_id` = `t`.`term_id`"; $info['field_id'] = $info['meta_field_id'] = 'term_id'; $info['field_index'] = $info['meta_field_index'] = $info['meta_field_value'] = 'name'; $info['field_slug'] = 'slug'; $info['field_type'] = 'taxonomy'; $info['field_parent'] = 'parent'; $info['field_parent_select'] = '`tt`.`' . $info['field_parent'] . '`'; if ('nav_menu' == $object_type) { $object = 'nav_menu'; } elseif ('post_format' == $object_type) { $object = 'post_format'; } if (empty($name)) { $prefix = 'taxonomy-'; // Make sure we actually have the prefix before trying anything with the name if (0 === strpos($object_type, $prefix)) { $name = substr($object_type, strlen($prefix), strlen($object_type)); } } if (!in_array($object_type, array('nav_menu', 'post_format'))) { $object_type = 'taxonomy'; } $taxonomy = pods_sanitize(empty($object) ? $name : $object); $info['pod_table'] = $wpdb->prefix . 'pods_' . pods_clean_name($taxonomy, true, false); $taxonomy_object = get_taxonomy($taxonomy); if (is_object($taxonomy_object) && $taxonomy_object->hierarchical) { $info['object_hierarchical'] = true; } $info['where'] = array('tt.taxonomy' => '`tt`.`' . $info['field_type'] . '` = "' . $taxonomy . '"'); // WPML Support if (is_object($sitepress) && $sitepress->is_translated_taxonomy($taxonomy) && !$icl_adjust_id_url_filter_off) { $info['join']['wpml_translations'] = "\n LEFT JOIN `{$wpdb->prefix}icl_translations` AS `wpml_translations`\n ON `wpml_translations`.`element_id` = `tt`.`term_taxonomy_id`\n AND `wpml_translations`.`element_type` = 'tax_{$taxonomy}'\n AND `wpml_translations`.`language_code` = '{$current_language}'\n "; $info['join']['wpml_languages'] = "\n LEFT JOIN `{$wpdb->prefix}icl_languages` AS `wpml_languages`\n ON `wpml_languages`.`code` = `wpml_translations`.`language_code` AND `wpml_languages`.`active` = 1\n "; $info['where']['wpml_languages'] = "`wpml_languages`.`code` IS NOT NULL"; } elseif (is_object($polylang) && !empty($current_language) && function_exists('pll_is_translated_taxonomy') && pll_is_translated_taxonomy($taxonomy)) { $info['join']['polylang_languages'] = "\n LEFT JOIN `{$wpdb->termmeta}` AS `polylang_languages`\n ON `polylang_languages`.`term_id` = `t`.`term_id`\n AND `polylang_languages`.`meta_value` = {$current_language_t_id}\n "; $info['where']['polylang_languages'] = "`polylang_languages`.`term_id` IS NOT NULL"; } $info['object_fields'] = $this->get_wp_object_fields($object_type, $info['pod']); } elseif ('user' == $object_type || 'user' == pods_var_raw('type', $info['pod'])) { $info['table'] = $wpdb->users; $info['meta_table'] = $wpdb->usermeta; $info['pod_table'] = $wpdb->prefix . 'pods_user'; $info['field_id'] = 'ID'; $info['field_index'] = 'display_name'; $info['field_slug'] = 'user_nicename'; $info['meta_field_id'] = 'user_id'; $info['meta_field_index'] = 'meta_key'; $info['meta_field_value'] = 'meta_value'; $info['where'] = array('user_status' => '`t`.`user_status` = 0'); $info['object_fields'] = $this->get_wp_object_fields($object_type, $info['pod']); } elseif ('comment' == $object_type || 'comment' == pods_var_raw('type', $info['pod'])) { //$info[ 'object_hierarchical' ] = true; $info['table'] = $wpdb->comments; $info['meta_table'] = $wpdb->commentmeta; $info['pod_table'] = $wpdb->prefix . 'pods_comment'; $info['field_id'] = 'comment_ID'; $info['field_index'] = 'comment_date'; $info['field_type'] = 'comment_type'; $info['field_parent'] = 'comment_parent'; $info['field_parent_select'] = '`t`.`' . $info['field_parent'] . '`'; $info['meta_field_id'] = 'comment_id'; $info['meta_field_index'] = 'meta_key'; $info['meta_field_value'] = 'meta_value'; $object = 'comment'; $comment_type = empty($object) ? $name : $object; $comment_type_clause = '`t`.`' . $info['field_type'] . '` = "' . $comment_type . '"'; if ('comment' == $comment_type) { $comment_type_clause = '( ' . $comment_type_clause . ' OR `t`.`' . $info['field_type'] . '` = "" )'; } $info['where'] = array('comment_approved' => '`t`.`comment_approved` = 1', 'comment_type' => $comment_type_clause); $info['orderby'] = '`t`.`' . $info['field_index'] . '` DESC, `t`.`' . $info['field_id'] . '`'; } elseif (in_array($object_type, array('option', 'settings')) || 'settings' == pods_var_raw('type', $info['pod'])) { $info['table'] = $wpdb->options; $info['meta_table'] = $wpdb->options; $info['field_id'] = 'option_id'; $info['field_index'] = 'option_name'; $info['meta_field_id'] = 'option_id'; $info['meta_field_index'] = 'option_name'; $info['meta_field_value'] = 'option_value'; $info['orderby'] = '`t`.`' . $info['field_index'] . '` ASC'; } elseif (is_multisite() && (in_array($object_type, array('site_option', 'site_settings')) || 'site_settings' == pods_var_raw('type', $info['pod']))) { $info['table'] = $wpdb->sitemeta; $info['meta_table'] = $wpdb->sitemeta; $info['field_id'] = 'site_id'; $info['field_index'] = 'meta_key'; $info['meta_field_id'] = 'site_id'; $info['meta_field_index'] = 'meta_key'; $info['meta_field_value'] = 'meta_value'; $info['orderby'] = '`t`.`' . $info['field_index'] . '` ASC'; } elseif (is_multisite() && 'network' == $object_type) { // Network = Site $info['table'] = $wpdb->site; $info['meta_table'] = $wpdb->sitemeta; $info['field_id'] = 'id'; $info['field_index'] = 'domain'; $info['meta_field_id'] = 'site_id'; $info['meta_field_index'] = 'meta_key'; $info['meta_field_value'] = 'meta_value'; $info['orderby'] = '`t`.`' . $info['field_index'] . '` ASC, `t`.`path` ASC, `t`.`' . $info['field_id'] . '`'; } elseif (is_multisite() && 'site' == $object_type) { // Site = Blog $info['table'] = $wpdb->blogs; $info['field_id'] = 'blog_id'; $info['field_index'] = 'domain'; $info['field_type'] = 'site_id'; $info['where'] = array('archived' => '`t`.`archived` = 0', 'spam' => '`t`.`spam` = 0', 'deleted' => '`t`.`deleted` = 0', 'site_id' => '`t`.`' . $info['field_type'] . '` = ' . (int) get_current_site()->id); $info['orderby'] = '`t`.`' . $info['field_index'] . '` ASC, `t`.`path` ASC, `t`.`' . $info['field_id'] . '`'; } elseif ('table' == $object_type || 'table' == pods_var_raw('type', $info['pod'])) { $info['table'] = empty($object) ? $name : $object; $info['pod_table'] = $wpdb->prefix . 'pods_' . $info['table']; if (!empty($field) && is_array($field)) { $info['table'] = pods_var_raw('pick_table', pods_var_raw('options', $field, $field)); $info['field_id'] = pods_var_raw('pick_table_id', pods_var_raw('options', $field, $field)); $info['field_index'] = $info['meta_field_index'] = $info['meta_field_value'] = pods_var_raw('pick_table_index', pods_var_raw('options', $field, $field)); } } $info['table'] = pods_clean_name($info['table'], false, false); $info['meta_table'] = pods_clean_name($info['meta_table'], false, false); $info['pod_table'] = pods_clean_name($info['pod_table'], false, false); $info['field_id'] = pods_clean_name($info['field_id'], false, false); $info['field_index'] = pods_clean_name($info['field_index'], false, false); $info['field_slug'] = pods_clean_name($info['field_slug'], false, false); $info['meta_field_id'] = pods_clean_name($info['meta_field_id'], false, false); $info['meta_field_index'] = pods_clean_name($info['meta_field_index'], false, false); $info['meta_field_value'] = pods_clean_name($info['meta_field_value'], false, false); if (empty($info['orderby'])) { $info['orderby'] = '`t`.`' . $info['field_index'] . '`, `t`.`' . $info['field_id'] . '`'; } if ('table' == pods_var_raw('storage', $info['pod']) && !in_array($object_type, array('pod', 'table'))) { $info['join']['d'] = 'LEFT JOIN `' . $info['pod_table'] . '` AS `d` ON `d`.`id` = `t`.`' . $info['field_id'] . '`'; //$info[ 'select' ] .= ', `d`.*'; } if (!empty($info['pod']) && is_array($info['pod'])) { $info['recurse'] = true; } $info['type'] = $object_type; $info['object_name'] = $object; if (pods_api_cache()) { if (did_action('init')) { pods_transient_set($transient, $info); } else { pods_transient_set($transient . '_pre_init', $info); } } } $info = $this->do_hook('get_table_info', $info, $object_type, $object, $name, $pod, $field); return $info; }
/** * Clean a value for use in class / id * * @since 2.0 */ public static function clean($input, $noarray = false, $db_field = false) { $output = trim((string) $input); $output = str_replace('--1', 'podsfixtemp1', $output); $output = str_replace('__1', 'podsfixtemp2', $output); if (false !== $noarray) { $output = preg_replace('/\\[podsfixtemp\\d+\\]/', '-', $output); $output = preg_replace('/\\[\\d*\\]/', '-', $output); } $output = str_replace(array('[', ']'), '-', $output); $output = pods_clean_name($output); $output = preg_replace('/([^a-z0-9\\-_])/', '', $output); $output = preg_replace('/(_){2,}/', '_', $output); $output = preg_replace('/(-){2,}/', '-', $output); if (true !== $db_field) { $output = str_replace('_', '-', $output); } $output = rtrim($output, '-'); $output = str_replace('podsfixtemp1', '--1', $output); $output = str_replace('podsfixtemp2', '__1', $output); return $output; }