/** * Create new field group. * * @param string $name Sanitized field group name. Note that the final name may change when new post is inserted. * @param string $title Field group title. * * @return null|Types_Field_Group The new field group or null on error. */ public static function create($name, $title = '', $status = 'draft') { // we cannot use self::get_instance here, because of low PHP requirements and missing get_called_class function // we have a fallback class for get_called_class but that scans files by debug_backtrace and return 'self' // instead of Types_Field_Group_Term_Factory like the original get_called_class() function does // ends in an error because of parents (abstract) $var = new self(); return Types_Field_Group_Post_Factory::get_instance()->create_field_group($name, $title, $status); }
/** * For a given field domain, return the appropriate field group factory instance. * * @param string $domain Valid field domain * @return Types_Field_Group_Factory * @since 2.1 */ public static function get_factory_by_domain($domain) { switch ($domain) { case Types_Field_Utils::DOMAIN_POSTS: return Types_Field_Group_Post_Factory::get_instance(); case Types_Field_Utils::DOMAIN_USERS: return Types_Field_Group_User_Factory::get_instance(); case Types_Field_Utils::DOMAIN_TERMS: return Types_Field_Group_Term_Factory::get_instance(); default: throw new InvalidArgumentException('Invalid field domain.'); } }
/** * Assigned Field Groups */ private function fetch_field_groups() { global $wpdb; $sql = 'SELECT post_id FROM ' . $wpdb->postmeta . ' WHERE meta_key="_wp_types_group_post_types" AND (meta_value LIKE "%' . $this->name . '%" OR meta_value="all" OR meta_value REGEXP "^[,]+$") ORDER BY post_id ASC'; $post_ids = $wpdb->get_col($sql); $this->field_groups = array(); foreach ($post_ids as $id) { $field_group = Types_Field_Group_Post_Factory::load($id); if ($field_group) { $this->field_groups[] = $field_group; } } }
private function new_post_field_group_action($type) { $type_object = get_post_type_object($type); $title = sprintf(__('Field Group for %s', 'types'), $type_object->labels->name); $name = sanitize_title($title); $new_post_field_group = Types_Field_Group_Post_Factory::get_instance()->create($name, $title, 'publish'); if (!$new_post_field_group) { return false; } $new_post_field_group->assign_post_type($type); $url = isset($_GET['ref']) ? 'admin.php?page=wpcf-edit&group_id=' . $new_post_field_group->get_id() . '&ref=' . sanitize_text_field($_GET['ref']) : 'admin.php?page=wpcf-edit&group_id=' . $new_post_field_group->get_id(); return admin_url($url); }
/** * Renders meta box content. * * @param $post * @param array $group * @param string $echo * @param bool $open_style_editor if true use code for open style editor when edit group * * @return string */ function wpcf_admin_post_meta_box($post, $group, $echo = '', $open_style_editor = false) { $field_group = Types_Field_Group_Post_Factory::load($group['args']['slug']); // todo Handle null $field_group. $group_wpml = new Types_Wpml_Field_Group($field_group); if (false === $open_style_editor && defined('WPTOOLSET_FORMS_VERSION')) { if (isset($group['args']['html'])) { /** * show group description */ if (array_key_exists('description', $group['args']) && !empty($group['args']['description'])) { echo '<div class="wpcf-meta-box-description">'; echo wpautop($group_wpml->translate_description()); echo '</div>'; } foreach ($group['args']['html'] as $field) { echo is_array($field) ? wptoolset_form_field('post', $field['config'], $field['meta']) : $field; } } return; } global $wpcf; /** * fake post object if need */ $post = wpcf_admin_create_fake_post_if_need($post); static $nonce_added = false; $group_output = ''; if (!isset($group['title'])) { $temp = $group; $group = ''; $group['args'] = $temp; $group['id'] = $temp['slug']; $group['title'] = $temp['name']; $name = $temp['name']; } if (!empty($echo)) { $group_output = '<h3>This Preview generated for latest post "' . $post->post_title . '"</h3>' . "\n" . '<!-- Previous lines visible only in Admin Style Editor.-->' . "\n\n"; $group_output .= '<div id="wpcf-group-' . $group['id'] . '" class="postbox " > <h3 class=\'hndle\'><span>' . $name . '</span></h3> <div class="inside">' . "\n"; } /* * TODO Document where this is used */ if (!$nonce_added && empty($echo)) { $nonce_action = 'update-' . $post->post_type . '_' . $post->ID; wp_nonce_field($nonce_action, '_wpcf_post_wpnonce'); $nonce_added = true; } $group_output .= "\n\n" . '<div id="wpcf-group-metabox-id-' . $group['args']['slug'] . '">' . "\n"; /* * TODO Move to Conditional code * * This is already checked. Use hook to add wrapper DIVS and apply CSS. */ if (!empty($group['args']['_conditional_display'])) { if ($group['args']['_conditional_display'] == 'failed') { $group_output .= '<div class="wpcf-cd-group wpcf-cd-group-failed" style="display:none;">'; } else { $group_output .= '<div class="wpcf-cd-group wpcf-cd-group-passed">'; } } /* * TODO Move this into Field code * Process fields */ if (!empty($group['args']['fields'])) { // Display description if (!empty($group['args']['description'])) { $group_output .= '<div class="wpcf-meta-box-description">' . wpautop($group_wpml->translate_description()) . '</div>'; } foreach ($group['args']['fields'] as $field_slug => $field) { if (empty($field) || !is_array($field)) { continue; } $field = $wpcf->field->_parse_cf_form_element($field); if (isset($field['wpcf-type'])) { // May be ignored $field = apply_filters('wpcf_fields_' . $field['wpcf-type'] . '_meta_box_form_value_display', $field); } if (!isset($field['#id'])) { $field['#id'] = wpcf_unique_id(serialize($field)); } // Render form elements if (wpcf_compare_wp_version() && array_key_exists('#type', $field) && 'wysiwyg' == $field['#type'] && !isset($field['#attributes']['disabled'])) { // if ( isset( $field['#attributes']['disabled'] ) ) { // $field['#editor_settings']['tinymce'] = false; // $field['#editor_settings']['teeny'] = false; // $field['#editor_settings']['media_buttons'] = false; // $field['#editor_settings']['quicktags'] = false; // $field['#editor_settings']['dfw'] = false; // } // Especially for WYSIWYG $group_output .= '<div class="wpcf-wysiwyg">'; $group_output .= '<div id="wpcf-textarea-textarea-wrapper" class="form-item form-item-textarea wpcf-form-item wpcf-form-item-textarea">'; $group_output .= isset($field['#before']) ? $field['#before'] : ''; $group_output .= '<label class="wpcf-form-label wpcf-form-textarea-label">' . stripslashes($field['#title']) . '</label>'; $group_output .= '<div class="description wpcf-form-description wpcf-form-description-textarea description-textarea"> ' . wpautop($field['#description']) . '</div>'; ob_start(); wp_editor($field['#value'], $field['#id'], $field['#editor_settings']); $group_output .= ob_get_clean() . "\n\n"; $field['slug'] = str_replace(WPCF_META_PREFIX . 'wysiwyg-', '', $field_slug); $field['type'] = 'wysiwyg'; $group_output .= '</div>'; $group_output .= isset($field['#after']) ? $field['#after'] : ''; $group_output .= '</div>'; } else { if (array_key_exists('#type', $field) && 'wysiwyg' == $field['#type']) { $field['#type'] = 'textarea'; } if (!empty($echo)) { $field['#validate'] = ''; } $group_output .= wpcf_form_simple(array($field['#id'] => $field)); } do_action('wpcf_fields_' . $field_slug . '_meta_box_form', $field); if (isset($field['wpcf-type'])) { // May be ignored do_action('wpcf_fields_' . $field['wpcf-type'] . '_meta_box_form', $field); } } } /* * TODO Move to Conditional code * * This is already checked. Use hook to add wrapper DIVS and apply CSS. */ if (!empty($group['args']['_conditional_display'])) { $group_output .= '</div>'; } $group_output .= '</div>'; if (!empty($echo)) { $group_output .= "\n\n</div></div>"; return $group_output; } else { echo $group_output; } }
/** * @inheritdoc * @return Types_Field_Group_Post_Factory * @since 2.0 */ public function get_group_factory() { return Types_Field_Group_Post_Factory::get_instance(); }
/** * Saves field. * * Note: This is (probably) intended only for saving field definition data on the Edit Field Group pages. * * @param array $field Field data * @param string $post_type * @param string $option_name * * @return string|WP_Error Field slug or an error object. */ function wpcf_admin_fields_save_field($field, $post_type = TYPES_CUSTOM_FIELD_GROUP_CPT_NAME, $option_name = 'wpcf-fields') { if (!isset($field['name']) || !isset($field['type'])) { return new WP_Error('wpcf_save_field_no_name_or_type', __("Error saving field", 'wpcf')); } $field = wpcf_sanitize_field($field); if (empty($field['name']) || empty($field['slug'])) { return new WP_Error('wpcf_save_field_no_name', __("Please set name for field", 'wpcf')); } $field['id'] = $field['slug']; // Set field specific data // NOTE: This was $field['data'] = $field and seemed to work on most systems. // I changed it to asign via a temporary variable to fix on one system. $temp_field = $field; $field['data'] = $temp_field; // Unset default fields // fixme These lines effectively erases all new values in "data", does anyone know why? // fixme This function needs SERIOUS review. unset($field['data']['type'], $field['data']['slug'], $field['data']['name'], $field['data']['description'], $field['data']['user_id'], $field['data']['id'], $field['data']['data']); // Merge previous data (added because of outside fields) // @TODO Remember why if (wpcf_types_cf_under_control('check_outsider', $field['id'], $post_type, $option_name)) { $field_previous_data = wpcf_admin_fields_get_field($field['id'], false, true, false, $option_name); if (!empty($field_previous_data['data'])) { $field['data'] = array_merge($field_previous_data['data'], $field['data']); } } $field['data'] = apply_filters('wpcf_fields_' . $field['type'] . '_meta_data', $field['data'], $field); // Check validation if (isset($field['data']['validate'])) { foreach ($field['data']['validate'] as $method => $data) { if (!isset($data['active'])) { unset($field['data']['validate'][$method]); } } if (empty($field['data']['validate'])) { unset($field['data']['validate']); } } $save_data = array(); $save_data['id'] = $field['id']; $save_data['slug'] = $field['slug']; $save_data['type'] = $field['type']; $save_data['name'] = $field['name']; $save_data['description'] = $field['description']; $save_data['data'] = $field['data']; $save_data['data']['disabled_by_type'] = 0; // For radios or select if (!empty($field['data']['options'])) { foreach ($field['data']['options'] as $name => $option) { if (isset($option['title'])) { $option['title'] = $field['data']['options'][$name]['title'] = htmlspecialchars_decode($option['title']); } if (isset($option['value'])) { $option['value'] = $field['data']['options'][$name]['value'] = htmlspecialchars_decode($option['value']); } if (isset($option['display_value'])) { $option['display_value'] = $field['data']['options'][$name]['display_value'] = htmlspecialchars_decode($option['display_value']); } // For checkboxes if ($field['type'] == 'checkboxes' && isset($option['set_value']) && $option['set_value'] != '1') { $option['set_value'] = $field['data']['options'][$name]['set_value'] = htmlspecialchars_decode($option['set_value']); } if ($field['type'] == 'checkboxes' && !empty($option['display_value_selected'])) { $option['display_value_selected'] = $field['data']['options'][$name]['display_value_selected'] = htmlspecialchars_decode($option['display_value_selected']); } if ($field['type'] == 'checkboxes' && !empty($option['display_value_not_selected'])) { $option['display_value_not_selected'] = $field['data']['options'][$name]['display_value_not_selected'] = htmlspecialchars_decode($option['display_value_not_selected']); } } } // For checkboxes if ('checkbox' == $field['type'] && isset($field['set_value']) && $field['set_value'] != '1') { $field['set_value'] = htmlspecialchars_decode($field['set_value']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_selected'])) { $field['display_value_selected'] = htmlspecialchars_decode($field['display_value_selected']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_not_selected'])) { $field['display_value_not_selected'] = htmlspecialchars_decode($field['display_value_not_selected']); } // Save field $fields = get_option($option_name, array()); // prevent erasing saved conditional display data (it's controlled via ajax) if (isset($fields[$field['slug']]['data']['conditional_display']) && !empty($fields[$field['slug']]['data']['conditional_display'])) { $save_data['data']['conditional_display'] = $fields[$field['slug']]['data']['conditional_display']; } // on changing a field slug if (isset($field['slug-pre-save']) && $field['slug'] != $field['slug-pre-save']) { // takeover conditions on renamed slug if (isset($fields[$field['slug-pre-save']]['data']['conditional_display']) && !empty($fields[$field['slug-pre-save']]['data']['conditional_display'])) { $save_data['data']['conditional_display'] = $fields[$field['slug-pre-save']]['data']['conditional_display']; } // field is assigned ONLY to current group $belongs_to_groups = wpcf_admin_fields_get_groups_by_field($field['slug-pre-save'], $post_type); if (isset($_GET['group_id']) && isset($fields[$field['slug-pre-save']]) && count($belongs_to_groups) == 1 && isset($belongs_to_groups[$_GET['group_id']])) { global $wpdb; // as it's the only group with this field we can update the slug for all items $wpdb->update($wpdb->postmeta, array('meta_key' => 'wpcf-' . $field['slug']), array('meta_key' => 'wpcf-' . $field['slug-pre-save']), array('%s'), array('%s')); // change slug in field conditions foreach ($fields as $key => &$single_field) { if (isset($single_field['data']['conditional_display']['conditions'])) { foreach ($single_field['data']['conditional_display']['conditions'] as &$single_condition) { if ($single_condition['field'] == $field['slug-pre-save']) { $single_condition['field'] = $field['slug']; } } } } // get all group conditions which contain the old slug $groups_conditions = $wpdb->get_results("\n SELECT post_id, meta_value\n FROM {$wpdb->postmeta}\n WHERE meta_key = '_wpcf_conditional_display'\n AND meta_value LIKE '%" . $field['slug-pre-save'] . "%'\n\t "); if ($groups_conditions) { foreach ($groups_conditions as $group_condition) { $meta_value = unserialize($group_condition->meta_value); // proper proof for slug if (isset($meta_value['conditions'])) { foreach ($meta_value['conditions'] as &$single_condition) { if ($single_condition['field'] == $field['slug-pre-save']) { // update conditions slug $single_condition['field'] = $field['slug']; update_post_meta($group_condition->post_id, '_wpcf_conditional_display', $meta_value); break; } } } } } // delete field wpcf_admin_fields_delete_field($field['slug-pre-save'], $post_type, $option_name); unset($fields[$field['slug-pre-save']]); // update items by post type } elseif (isset($_GET['group_id'])) { switch ($post_type) { case 'wp-types-group': $group = Types_Field_Group_Post_Factory::load($_GET['group_id']); break; case 'wp-types-term-group': $group = Types_Field_Group_Term_Factory::load($_GET['group_id']); break; case 'wp-types-user-group': $group = Types_Field_Group_User_Factory::load($_GET['group_id']); break; } if (null != $group) { $assigned_types = $group->get_assigned_to_types(); if (!empty($assigned_types)) { $items = $group->get_assigned_to_items(); if (is_array($items) && !empty($items)) { global $wpdb; foreach ($items as $item) { $wpdb->update($wpdb->postmeta, array('meta_key' => 'wpcf-' . $field['slug']), array('meta_key' => 'wpcf-' . $field['slug-pre-save'], 'post_id' => $item->ID), array('%s', '%d'), array('%s')); } } } } } } $fields[$field['slug']] = $save_data; update_option($option_name, $fields); $field_id = $field['slug']; // WPML register strings if (function_exists('icl_register_string')) { if (isset($_POST['wpml_cf_translation_preferences'][$field_id])) { $__wpml_action = intval($_POST['wpml_cf_translation_preferences'][$field_id]); } else { $__wpml_action = wpcf_wpml_get_action_by_type($field['type']); } wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' name', $field['name']); wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' description', $field['description']); // For radios or select if (!empty($field['data']['options'])) { foreach ($field['data']['options'] as $name => $option) { if ($name == 'default') { continue; } if (isset($option['title'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' title', $option['title']); } if ($__wpml_action === 2) { if (isset($option['value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' value', $option['value']); } } if (isset($option['display_value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value', $option['display_value']); } // For checkboxes if (isset($option['set_value']) && $option['set_value'] != '1') { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' value', $option['set_value']); } if (!empty($option['display_value_selected'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value selected', $option['display_value_selected']); } if (!empty($option['display_value_not_selected'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value not selected', $option['display_value_not_selected']); } } } if ($field['type'] == 'checkbox' && $field['set_value'] != '1') { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value', $field['set_value']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value selected', $field['display_value_selected']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_not_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value not selected', $field['display_value_not_selected']); } // Validation message if (!empty($field['data']['validate'])) { foreach ($field['data']['validate'] as $method => $validation) { if (!empty($validation['message'])) { // Skip if it's same as default $default_message = wpcf_admin_validation_messages($method); if ($validation['message'] != $default_message) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' validation message ' . $method, $validation['message']); } } } } } /** * WPML update translation status */ if (isset($save_data['data']) && isset($save_data['data']['submit-key'])) { if (isset($_POST['wpml_cf_translation_preferences'][$save_data['data']['submit-key']])) { do_action('wpml_config', array('section' => 'custom-fields', 'key' => wpcf_types_get_meta_prefix(wpcf_admin_fields_get_field($save_data['slug'])) . $save_data['slug'], 'value' => intval($_POST['wpml_cf_translation_preferences'][$save_data['data']['submit-key']]), 'read_only' => true)); } } return $field_id; }
/** * Bulk translation. */ function wpcf_admin_bulk_string_translation() { if (!function_exists('icl_register_string')) { return false; } require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/custom-types.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/custom-taxonomies.php'; // Register groups $groups = wpcf_admin_fields_get_groups(); foreach ($groups as $group_id => $group) { $group_wpml = new Types_Wpml_Field_Group(Types_Field_Group_Post_Factory::load($group['slug'])); $group_wpml->register(); } // Register fields $fields = wpcf_admin_fields_get_fields(); foreach ($fields as $field_id => $field) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' name', $field['name']); if (isset($field['description'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' description', $field['description']); } // For radios or select if (!empty($field['data']['options'])) { foreach ($field['data']['options'] as $name => $option) { if ($name == 'default') { continue; } if (isset($option['title'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' title', $option['title']); } if (wpcf_wpml_field_is_translated($field)) { if (isset($option['value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' value', $option['value']); } } if (isset($option['display_value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value', $option['display_value']); } } } if ($field['type'] == 'checkbox' && (isset($field['set_value']) && $field['set_value'] != '1')) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value', $field['set_value']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value selected', $field['display_value_selected']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_not_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value not selected', $field['display_value_not_selected']); } // Validation message if (!empty($field['data']['validate'])) { foreach ($field['data']['validate'] as $method => $validation) { if (!empty($validation['message'])) { // Skip if it's same as default $default_message = wpcf_admin_validation_messages($method); if ($validation['message'] != $default_message) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' validation message ' . $method, $validation['message']); } } } } } // Register types $custom_types = get_option(WPCF_OPTION_NAME_CUSTOM_TYPES, array()); foreach ($custom_types as $post_type => $data) { wpcf_custom_types_register_translation($post_type, $data); } // Register taxonomies $custom_taxonomies = get_option(WPCF_OPTION_NAME_CUSTOM_TAXONOMIES, array()); foreach ($custom_taxonomies as $taxonomy => $data) { wpcf_custom_taxonimies_register_translation($taxonomy, $data); } }