/** * Fetch children by post type. * * @global object $wpdb * * @param type $post * @param type $post_type * @param string $data * @param array $params * @param array $user_query - Override default query * @return type */ public static function getChildrenByPostType($post, $post_type, $data, $params = array(), $user_query = array()) { if (empty($post->ID)) { return array(); } global $wpdb; $items = array(); // Merge with user query $query = wp_parse_args($user_query, array('post_type' => $post_type, 'numberposts' => -1, 'post_status' => array('publish', 'pending', 'draft', 'future', 'private'), 'meta_key' => '_wpcf_belongs_' . $post->post_type . '_id', 'meta_value' => $post->ID, 'suppress_filters' => 0)); // Cleanup data if (empty($data['fields_setting'])) { $data['fields_setting'] = 'all_cf'; } // List items if (isset($params['sort']) && isset($params['field'])) { // Set sorting $query['order'] = esc_attr(strtoupper(strval($params['sort']))); if (!preg_match('/^(A|DE)SC$/', $query['order'])) { $query['order'] = 'ASC'; } /* * * Order by title */ if ($params['field'] == '_wp_title') { $query['orderby'] = 'title'; $query = apply_filters('wpcf_relationship_get_children_query', $query, $post, $post_type, $data, esc_attr($params['field'])); $items = get_posts($query); /* * * Order by parents */ } else { if ($params['field'] == '_wpcf_pr_parent') { $query = apply_filters('wpcf_relationship_get_children_query', $query, $post, $post_type, $data, esc_attr($params['field'])); $items = get_posts($query); if (!empty($items)) { $include = array(); $additional = array(); foreach ($items as $item) { $meta = wpcf_get_post_meta($item->ID, '_wpcf_belongs_' . esc_attr($params['post_type_sort_parent']) . '_id', true); if (empty($meta)) { $additional[] = $item; continue; } $include[intval($meta)][] = $item; } if (!empty($include)) { ksort($include, SORT_NUMERIC); if ($query['order'] == 'DESC') { $include = array_reverse($include); } $sorted = array(); foreach ($include as $meta_value => $posts) { foreach ($posts as $post) { $sorted[] = $post; } } $items = array_merge($sorted, $additional); } } /* * * Order by body */ } else { if ($params['field'] == '_wp_body') { $_query = "\r\r\n SELECT p.ID\r\r\n FROM {$wpdb->posts} p\r\r\n WHERE p.post_type = %s\r\r\n AND p.post_status NOT IN ('auto-draft', 'trash', 'inherit')\r\r\n ORDER BY p.post_content " . ('ASC' == $query['order'] ? 'ASC' : 'DESC'); $sorted = $wpdb->get_results($wpdb->prepare($_query, $post_type)); if (!empty($sorted)) { $query['orderby'] = 'post__in'; foreach ($sorted as $key => $value) { $query['post__in'][] = $value->ID; } } $query = apply_filters('wpcf_relationship_get_children_query', $query, $post, $post_type, $data, esc_attr($params['field'])); $items = get_posts($query); /* * * * Order by custom field */ } else { $field = wpcf_admin_fields_get_field(str_replace('wpcf-', '', $params['field'])); if (!empty($field)) { $query['orderby'] = isset($field['type']) && in_array($field['type'], array('numeric', 'date')) ? 'meta_value_num' : 'meta_value'; } $query = apply_filters('wpcf_relationship_get_children_query', $query, $post, $post_type, $data, esc_attr($params['field'])); $items = get_posts($query); if (!empty($items)) { $include = array(); $additional = array(); foreach ($items as $item) { $meta = wpcf_get_post_meta($item->ID, 'wpcf-' . $field['slug'], true); if (empty($meta)) { $additional[] = $item; continue; } $check = wpcf_cd_post_edit_field_filter(array(), $field, $item, 'post-relationship-sort'); if (isset($check['__wpcf_cd_status']) && $check['__wpcf_cd_status'] == 'failed') { $additional[] = $item; continue; } $key = $query['orderby'] == 'meta_value_num' ? intval($meta) : strval($meta); $include[$key][] = $item; } if (!empty($include)) { if ($query['orderby'] == 'meta_value_num') { ksort($include, SORT_NUMERIC); } else { ksort($include, SORT_STRING); } if ($query['order'] == 'DESC') { $include = array_reverse($include); } $sorted = array(); foreach ($include as $meta_value => $posts) { foreach ($posts as $post) { $sorted[] = $post; } } $items = array_merge($sorted, $additional); } } } } } /** * * Regular * */ } else { $query = apply_filters('wpcf_relationship_get_children_query', $query, $post, $post_type, $data); $items = get_posts($query); } return $items; }
/** * All AJAX calls go here. */ function wpcf_ajax_embedded() { if (!isset($_REQUEST['_wpnonce']) || !wp_verify_nonce($_REQUEST['_wpnonce'], $_REQUEST['wpcf_action'])) { die('Verification failed'); } switch ($_REQUEST['wpcf_action']) { case 'editor_insert_date': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields/date.php'; wpcf_fields_date_editor_form(); break; case 'insert_skype_button': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields/skype.php'; wpcf_fields_skype_meta_box_ajax(); break; case 'editor_callback': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; $field = wpcf_admin_fields_get_field($_GET['field_id']); if (!empty($field)) { $function = 'wpcf_fields_' . $field['type'] . '_editor_callback'; if (function_exists($function)) { call_user_func($function); } } break; case 'dismiss_message': if (isset($_GET['id'])) { $messages = get_option('wpcf_dismissed_messages', array()); $messages[] = $_GET['id']; update_option('wpcf_dismissed_messages', $messages); } break; case 'pr_add_child_post': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields-post.php'; require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; $output = 'Passed wrong parameters'; if (isset($_GET['post_id']) && isset($_GET['post_type_child']) && isset($_GET['post_type_parent'])) { $relationships = get_option('wpcf_post_relationship', array()); $post = get_post($_GET['post_id']); $post_type = $_GET['post_type_child']; $parent_post_type = $_GET['post_type_parent']; $data = $relationships[$parent_post_type][$post_type]; $output = wpcf_pr_admin_post_meta_box_has_row($post, $post_type, $data, $parent_post_type, false); } echo json_encode(array('output' => $output)); break; case 'pr_save_child_post': ob_start(); // Try to catch any errors require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; $output = array(); if (isset($_GET['post_id']) && isset($_GET['post_type_child'])) { $post = get_post($_GET['post_id']); $post_type = $_GET['post_type_child']; $output = wpcf_pr_admin_save_post_hook($_GET['post_id']); } $errors = ob_get_clean(); echo json_encode(array('output' => $output, 'errors' => $errors)); break; case 'pr_delete_child_post': require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; $output = 'Passed wrong parameters'; if (isset($_GET['post_id'])) { $output = wpcf_pr_admin_delete_child_item($_GET['post_id']); } echo json_encode(array('output' => $output)); break; case 'pr-update-belongs': require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; $output = 'Passed wrong parameters'; if (isset($_POST['post_id']) && isset($_POST['wpcf_pr_belongs'])) { $output = wpcf_pr_admin_update_belongs($_POST['post_id'], $_POST['wpcf_pr_belongs']); } echo json_encode(array('output' => $output)); break; case 'pr_pagination': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields-post.php'; require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; $output = 'Passed wrong parameters'; if (isset($_GET['post_id']) && isset($_GET['post_type'])) { $post = get_post($_GET['post_id']); $post_type = $_GET['post_type']; $has = wpcf_pr_admin_get_has($post->post_type); $output = wpcf_pr_admin_post_meta_box_has_form($post, $post_type, $has[$post_type], $post->post_type); } echo json_encode(array('output' => $output)); break; case 'pr_sort': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields-post.php'; require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; $output = 'Passed wrong parameters'; if (isset($_GET['field']) && isset($_GET['sort']) && isset($_GET['post_id']) && isset($_GET['post_type'])) { $post = get_post($_GET['post_id']); $post_type = $_GET['post_type']; $has = wpcf_pr_admin_get_has($post->post_type); $output = wpcf_pr_admin_post_meta_box_has_form($post, $post_type, $has[$post_type], $post->post_type); } echo json_encode(array('output' => $output)); break; case 'pr_sort_parent': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields-post.php'; require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; $output = 'Passed wrong parameters'; if (isset($_GET['field']) && isset($_GET['sort']) && isset($_GET['post_id']) && isset($_GET['post_type'])) { $post = get_post($_GET['post_id']); $post_type = $_GET['post_type']; $has = wpcf_pr_admin_get_has($post->post_type); $output = wpcf_pr_admin_post_meta_box_has_form($post, $post_type, $has[$post_type], $post->post_type); } echo json_encode(array('output' => $output)); break; case 'pr_save_all': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields-post.php'; require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; $output = array(); if (isset($_POST['post_id']) && isset($_POST['wpcf_post_relationship'])) { $output = wpcf_pr_admin_save_post_hook($_POST['post_id']); } echo json_encode(array('output' => $output)); break; case 'repetitive_add': if (isset($_GET['field_id'])) { require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields-post.php'; $field = wpcf_admin_fields_get_field($_GET['field_id']); // Pass as normal unset($field['data']['repetitive']); $fields = array($_GET['field_id'] => $field); $element = wpcf_admin_post_process_fields(false, $fields, false, false, 'repetitive'); if ($field['type'] == 'skype') { $key = key($element); unset($element[$key]['#title']); echo json_encode(array('output' => wpcf_form_simple($element) . wpcf_form_render_js_validation('#post', false))); } else { $element = array_shift($element); if (!in_array($field['type'], array('checkbox'))) { unset($element['#title']); } echo json_encode(array('output' => wpcf_form_simple(array('repetitive' => $element)) . wpcf_form_render_js_validation('#post', false))); } } else { echo json_encode(array('output' => 'params missing')); } break; case 'repetitive_delete': if (isset($_POST['post_id']) && isset($_POST['field_id']) && isset($_POST['old_value'])) { require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; $field = wpcf_admin_fields_get_field($_POST['field_id']); if (!empty($field)) { if ($field['type'] == 'date') { delete_post_meta($_POST['post_id'], wpcf_types_get_meta_prefix($field) . $field['id'], strtotime(base64_decode($_POST['old_value']))); } else { if ($field['type'] == 'skype') { delete_post_meta($_POST['post_id'], wpcf_types_get_meta_prefix($field) . $field['id'], unserialize(base64_decode($_POST['old_value']))); } else { delete_post_meta($_POST['post_id'], wpcf_types_get_meta_prefix($field) . $field['id'], base64_decode($_POST['old_value'])); } } echo json_encode(array('output' => 'deleted')); } else { echo json_encode(array('output' => 'field not found')); } } else { echo json_encode(array('output' => 'params missing')); } break; case 'cd_verify': if (!is_array($_POST['wpcf'])) { die; } require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/conditional-display.php'; $passed_fields = array(); $failed_fields = array(); $post = false; if (isset($_SERVER['HTTP_REFERER'])) { $split = explode('?', $_SERVER['HTTP_REFERER']); if (isset($split[1])) { parse_str($split[1], $vars); if (isset($vars['post'])) { $_POST['post_ID'] = $vars['post']; $post = get_post($vars['post']); } } } // Dummy post if (!$post) { $post = new stdClass(); $post->ID = 1; } // Filter meta values (switch them with $_POST values) add_filter('get_post_metadata', 'wpcf_cd_meta_ajax_validation_filter', 10, 4); foreach ($_POST['wpcf'] as $field_id => $field_value) { $element = array(); $field = wpcf_admin_fields_get_field($field_id); if (!empty($field['data']['conditional_display']['conditions'])) { $element = wpcf_cd_post_edit_field_filter($element, $field, $post, 'group'); if (isset($element['__wpcf_cd_status']) && $element['__wpcf_cd_status'] == 'passed') { $passed_fields[] = 'wpcf[' . $field['id'] . ']'; } else { $failed_fields[] = 'wpcf[' . $field['id'] . ']'; } } } // Remove filter meta values (switch them with $_POST values) remove_filter('get_post_metadata', 'wpcf_cd_meta_ajax_validation_filter', 10, 4); if (!empty($passed_fields) || !empty($failed_fields)) { $execute = ''; foreach ($passed_fields as $field_name) { $execute .= 'jQuery(\'[name^="' . $field_name . '"]\').parents(\'.wpcf-cd\').show().removeClass(\'wpcf-cd-failed\').addClass(\'wpcf-cd-passed\');' . " "; } foreach ($failed_fields as $field_name) { $execute .= 'jQuery(\'[name^="' . $field_name . '"]\').parents(\'.wpcf-cd\').hide().addClass(\'wpcf-cd-failed\').removeClass(\'wpcf-cd-passed\');' . " "; } echo json_encode(array('output' => '', 'execute' => $execute, 'wpcf_nonce_ajax_callback' => wp_create_nonce('execute'))); } die; break; case 'cd_group_verify': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/conditional-display.php'; $group = wpcf_admin_fields_get_group($_POST['group_id']); if (empty($group)) { echo json_encode(array('output' => '')); die; } $execute = ''; $group['conditional_display'] = get_post_meta($group['id'], '_wpcf_conditional_display', true); // Filter meta values (switch them with $_POST values) add_filter('get_post_metadata', 'wpcf_cd_meta_ajax_validation_filter', 10, 4); $post = false; if (isset($_SERVER['HTTP_REFERER'])) { $split = explode('?', $_SERVER['HTTP_REFERER']); if (isset($split[1])) { parse_str($split[1], $vars); if (isset($vars['post'])) { $_POST['post_ID'] = $vars['post']; $post = get_post($vars['post']); } } } // Dummy post if (!$post) { $post = new stdClass(); $post->ID = 1; } if (!empty($group['conditional_display']['conditions'])) { $result = wpcf_cd_post_groups_filter(array(0 => $group), $post, 'group'); if (!empty($result)) { $result = array_shift($result); $passed = $result['_conditional_display'] == 'passed' ? true : false; } else { $passed = false; } if (!$passed) { $execute = 'jQuery("#' . $group['slug'] . '").slideUp().find(".wpcf-cd-group").addClass(\'wpcf-cd-group-failed\').removeClass(\'wpcf-cd-group-passed\').hide();'; } else { $execute = 'jQuery("#' . $group['slug'] . '").show().find(".wpcf-cd-group").addClass(\'wpcf-cd-group-passed\').removeClass(\'wpcf-cd-group-failed\').slideDown();'; } } // Remove filter meta values (switch them with $_POST values) remove_filter('get_post_metadata', 'wpcf_cd_meta_ajax_validation_filter', 10, 4); echo json_encode(array('output' => '', 'execute' => $execute, 'wpcf_nonce_ajax_callback' => wp_create_nonce('execute'))); break; case 'pr_verify': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/conditional-display.php'; $passed_fields = array(); $failed_fields = array(); $post = false; if (isset($_SERVER['HTTP_REFERER'])) { $split = explode('?', $_SERVER['HTTP_REFERER']); if (isset($split[1])) { parse_str($split[1], $vars); if (isset($vars['post'])) { $_POST['post_ID'] = $vars['post']; $post = get_post($vars['post']); } } } // Dummy post if (!$post) { $post = new stdClass(); $post->ID = 1; } // Filter meta values (switch them with $_POST values) add_filter('get_post_metadata', 'wpcf_cd_pr_meta_ajax_validation_filter', 10, 4); if (isset($_POST['wpcf_post_relationship'])) { $child_post_id = key($_POST['wpcf_post_relationship']); $data = $_POST['wpcf_post_relationship'] = array_shift($_POST['wpcf_post_relationship']); foreach ($data as $field_id => $field_value) { $element = array(); $field = wpcf_admin_fields_get_field(str_replace(WPCF_META_PREFIX, '', $field_id)); if (!empty($field['data']['conditional_display']['conditions'])) { $element = wpcf_cd_post_edit_field_filter($element, $field, $post, 'group'); if (isset($element['__wpcf_cd_status']) && $element['__wpcf_cd_status'] == 'passed') { $passed_fields[] = 'wpcf_post_relationship_' . $child_post_id . '_' . $field['id']; } else { $failed_fields[] = 'wpcf_post_relationship_' . $child_post_id . '_' . $field['id']; } } } } // Remove filter meta values (switch them with $_POST values) remove_filter('get_post_metadata', 'wpcf_cd_pr_meta_ajax_validation_filter', 10, 4); if (!empty($passed_fields) || !empty($failed_fields)) { $execute = ''; foreach ($passed_fields as $field_name) { $execute .= 'jQuery(\'#' . $field_name . '\').parents(\'.wpcf-cd\').show().removeClass(\'wpcf-cd-failed\').addClass(\'wpcf-cd-passed\');' . " "; } foreach ($failed_fields as $field_name) { $execute .= 'jQuery(\'#' . $field_name . '\').parents(\'.wpcf-cd\').hide().addClass(\'wpcf-cd-failed\').removeClass(\'wpcf-cd-passed\');' . " "; } echo json_encode(array('output' => '', 'execute' => $execute, 'wpcf_nonce_ajax_callback' => wp_create_nonce('execute'))); } die; break; default: break; } if (function_exists('wpcf_ajax')) { wpcf_ajax(); } die; }
/** * All AJAX calls go here. */ function wpcf_ajax_embedded() { if (!isset($_REQUEST['_wpnonce']) || !wp_verify_nonce($_REQUEST['_wpnonce'], $_REQUEST['wpcf_action'])) { die('Verification failed'); } global $wpcf; switch ($_REQUEST['wpcf_action']) { case 'editor_insert_date': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields/date.php'; wpcf_fields_date_editor_form(); break; case 'insert_skype_button': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields/skype.php'; wpcf_fields_skype_meta_box_ajax(); break; case 'editor_callback': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; $field = wpcf_admin_fields_get_field($_GET['field_id']); if (!empty($field)) { $function = 'wpcf_fields_' . $field['type'] . '_editor_callback'; if (function_exists($function)) { call_user_func($function); } } break; case 'dismiss_message': if (isset($_GET['id'])) { $messages = get_option('wpcf_dismissed_messages', array()); $messages[] = $_GET['id']; update_option('wpcf_dismissed_messages', $messages); } break; case 'pr_add_child_post': $output = 'Passed wrong parameters'; if (isset($_GET['post_id']) && isset($_GET['post_type_child']) && isset($_GET['post_type_parent'])) { // Fix for Common Conditional check $_POST['post_ID'] = $_GET['post_id']; $relationships = get_option('wpcf_post_relationship', array()); $post = get_post(intval($_GET['post_id'])); if (!empty($post->ID)) { $post_type = strval($_GET['post_type_child']); $parent_post_type = strval($_GET['post_type_parent']); $data = $relationships[$parent_post_type][$post_type]; /* * Since Types 1.1.5 * * We save new post * CHECKPOINT */ $id = $wpcf->relationship->add_new_child($post->ID, $post_type); if (!is_wp_error($id)) { /* * Here we set Relationship * CHECKPOINT */ $parent = get_post(intval($_GET['post_id'])); $child = get_post($id); if (!empty($parent->ID) && !empty($child->ID)) { // Set post $wpcf->post = $child; // Set relationship :) $wpcf->relationship->_set($parent, $child, $data); // Render new row $output = $wpcf->relationship->child_row($post->ID, $id, $data); } else { $output = __('Error creating post relationship', 'wpcf'); } } else { $output = $id->get_error_message(); } } else { $output = __('Error getting parent post', 'wpcf'); } } echo json_encode(array('output' => $output . wpcf_form_render_js_validation('#post', false))); break; case 'pr_save_all': $output = ''; if (isset($_POST['post_id'])) { // Fix for Common Conditional check $_POST['post_ID'] = $_POST['post_id']; $parent_id = intval($_POST['post_id']); if (isset($_POST['wpcf_post_relationship'][$parent_id])) { $wpcf->relationship->save_children($parent_id, (array) $_POST['wpcf_post_relationship'][$parent_id]); $output = $wpcf->relationship->child_meta_form($parent_id, strval($_POST['post_type'])); } } // TODO Move to conditional $output .= '<script type="text/javascript">wpcfConditionalInit();</script>'; echo json_encode(array('output' => $output)); break; case 'pr_save_child_post': ob_start(); // Try to catch any errors $output = ''; if (isset($_GET['post_id']) && isset($_GET['parent_id']) && isset($_GET['post_type_parent']) && isset($_GET['post_type_child']) && isset($_POST['wpcf_post_relationship'])) { // Fix for Common Conditional check $_POST['post_ID'] = $_POST['post_id']; $parent_id = intval($_GET['parent_id']); $child_id = intval($_GET['post_id']); $parent_post_type = strval($_GET['post_type_parent']); $child_post_type = strval($_GET['post_type_child']); if (isset($_POST['wpcf_post_relationship'][$parent_id][$child_id])) { $fields = (array) $_POST['wpcf_post_relationship'][$parent_id][$child_id]; $wpcf->relationship->save_child($parent_id, $child_id, $fields); $output = $wpcf->relationship->child_row($parent_id, $child_id, $wpcf->relationship->settings($parent_post_type, $child_post_type)); // TODO Move to conditional $output .= '<script type="text/javascript">wpcfConditionalInit(\'#types-child-row-' . $child_id . '\');</script>'; } } $errors = ob_get_clean(); echo json_encode(array('output' => $output, 'errors' => $errors)); break; case 'pr_delete_child_post': require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; $output = 'Passed wrong parameters'; if (isset($_GET['post_id'])) { $output = wpcf_pr_admin_delete_child_item(intval($_GET['post_id'])); } echo json_encode(array('output' => $output)); break; case 'pr-update-belongs': require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; $output = 'Passed wrong parameters'; if (isset($_POST['post_id']) && isset($_POST['wpcf_pr_belongs'][$_POST['post_id']])) { $post_id = intval($_POST['post_id']); $output = wpcf_pr_admin_update_belongs($post_id, $_POST['wpcf_pr_belongs'][$post_id]); } echo json_encode(array('output' => $output)); break; case 'pr_pagination': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields-post.php'; require_once WPCF_EMBEDDED_ABSPATH . '/includes/post-relationship.php'; $output = 'Passed wrong parameters'; if (isset($_GET['post_id']) && isset($_GET['post_type'])) { global $wpcf; $parent = get_post(esc_attr($_GET['post_id'])); $child_post_type = esc_attr($_GET['post_type']); if (!empty($parent->ID)) { // Set post in loop $wpcf->post = $parent; // Save items_per_page $wpcf->relationship->save_items_per_page($parent->post_type, $child_post_type, intval($_GET[$wpcf->relationship->items_per_page_option_name])); $output = $wpcf->relationship->child_meta_form($parent->ID, $child_post_type); } } echo json_encode(array('output' => $output)); break; case 'pr_sort': $output = 'Passed wrong parameters'; if (isset($_GET['field']) && isset($_GET['sort']) && isset($_GET['post_id']) && isset($_GET['post_type'])) { $output = $wpcf->relationship->child_meta_form(intval($_GET['post_id']), strval($_GET['post_type'])); } echo json_encode(array('output' => $output)); break; case 'pr_sort_parent': $output = 'Passed wrong parameters'; if (isset($_GET['field']) && isset($_GET['sort']) && isset($_GET['post_id']) && isset($_GET['post_type'])) { $output = $wpcf->relationship->child_meta_form(intval($_GET['post_id']), strval($_GET['post_type'])); } echo json_encode(array('output' => $output)); break; case 'repetitive_add': if (isset($_GET['field_id'])) { require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields-post.php'; $field = wpcf_admin_fields_get_field($_GET['field_id']); $post_id = intval($_GET['post_id']); /* * When post is new - post_id is 0 * We can safely set post_id to 1 cause * values compared are filtered anyway. */ if ($post_id == 0) { $post_id = 1; } $post = get_post($post_id); global $wpcf; $wpcf->repeater->set($post, $field); /* * * Force empty values! */ $wpcf->repeater->cf['value'] = null; $wpcf->repeater->meta = null; $form = $wpcf->repeater->get_field_form(null, true); echo json_encode(array('output' => wpcf_form_simple($form) . wpcf_form_render_js_validation('#post', false))); } else { echo json_encode(array('output' => 'params missing')); } break; case 'repetitive_delete': if (isset($_POST['post_id']) && isset($_POST['field_id'])) { require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; $post = get_post($_POST['post_id']); $field = wpcf_admin_fields_get_field($_POST['field_id']); $meta_id = $_POST['meta_id']; if (!empty($field) && !empty($post->ID) && !empty($meta_id)) { /* * * * Changed. * Since Types 1.2 */ global $wpcf; $wpcf->repeater->set($post, $field); $wpcf->repeater->delete($meta_id); echo json_encode(array('output' => 'deleted')); } else { echo json_encode(array('output' => 'field or post not found')); } } else { echo json_encode(array('output' => 'params missing')); } break; case 'cd_verify': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/conditional-display.php'; global $wpcf; $post = null; $fields = array(); $passed_fields = array(); $failed_fields = array(); $_flag_relationship = false; /* * We're accepting main form and others too * (like 'wpcf_post_relationship') * $fields = apply_filters( 'conditional_submitted_data', $data ); */ if (!empty($_POST['wpcf'])) { $fields = apply_filters('types_ajax_conditional_post', $_POST['wpcf']); } // TODO Move this to conditional and use hooks if (empty($fields) && empty($_POST['wpcf_post_relationship'])) { die; } else { if (empty($fields) && !empty($_POST['wpcf_post_relationship'])) { /* * * * Relationship case * TODO Move to relationship or elsewhere. */ $_temp = $_POST['wpcf_post_relationship']; $parent_id = key($_temp); $_data = array_shift($_temp); $post_id = key($_data); $post = get_post($post_id); $fields = $_data[$post_id]; // Force $_POST['post_ID'] = $post_id; /* * TODO This is temporary fix. Find better way to get fields * rendered in child form */ $_all_fields = wpcf_admin_fields_get_fields(); foreach ($_all_fields as $_field) { $_slug = WPCF_META_PREFIX . $_field['slug']; if (!isset($fields[$_slug])) { $fields[$_slug] = null; } } $_flag_relationship = true; /* * * * * * Regular submission * TODO Make better? */ } else { if (isset($_POST['wpcf_main_post_id'])) { $_POST['post_ID'] = intval($_POST['wpcf_main_post_id']); $post = get_post($_POST['post_ID']); } else { if (isset($_SERVER['HTTP_REFERER'])) { $split = explode('?', $_SERVER['HTTP_REFERER']); if (isset($split[1])) { parse_str($split[1], $vars); if (isset($vars['post'])) { $_POST['post_ID'] = $vars['post']; $post = get_post($vars['post']); } } } } /* * * Get fields by post and group. */ // $group_id = isset( $_POST['wpcf_group'] ) ? $_POST['wpcf_group'] : false; // if ( $group_id ) { // $group = wpcf_admin_fields_get_group( $group_id ); // if ( !empty( $group ) ) { // $_fields = wpcf_admin_fields_get_fields_by_group( $group['id'] ); // /* // * Set missing fields to null (checkboxes and radios) // */ // foreach ( $_fields as $_field ) { // if ( !isset( $fields[$_field['slug']] ) ) { // $fields[$_field['slug']] = null; // } // } // } // } // We need all fields $_all_fields = wpcf_admin_fields_get_fields(); foreach ($_all_fields as $_field) { if (!isset($fields[$_field['slug']])) { $fields[$_field['slug']] = null; } } } } // Dummy post if (empty($post->ID)) { $post = new stdClass(); $post->ID = 1; } foreach ($fields as $field_id => $field_value) { // Set conditional $wpcf->conditional->set($post, $field_id); if (!empty($wpcf->conditional->cf['data']['conditional_display']['conditions'])) { if ($_flag_relationship) { // Set context $wpcf->conditional->context = 'relationship'; /* * We need parent and child */ $_relationship_name = false; // Set name $parent = get_post($parent_id); if (!empty($parent->ID)) { $wpcf->relationship->set($parent, $post); $wpcf->relationship->cf->set($post, $field_id); $_child = $wpcf->relationship->get_child(); $_child->form->cf->set($post, $field_id); $_relationship_name = $_child->form->alter_form_name('wpcf[' . $wpcf->conditional->cf['id'] . ']'); } if (!$_relationship_name) { continue; } add_filter('types_field_get_submitted_data', 'wpcf_relationship_ajax_data_filter', 10, 2); $name = $_relationship_name; } else { $name = 'wpcf[' . $wpcf->conditional->cf['id'] . ']'; } /* * Since Types 1.2 * Moved to WPCF_Conditional class. */ // Evaluate $passed = $wpcf->conditional->evaluate(); if ($passed) { $passed_fields[] = $name; } else { $failed_fields[] = $name; } } } /* * * * Render JS */ if (!empty($passed_fields) || !empty($failed_fields)) { $execute = ''; foreach ($passed_fields as $field_name) { $execute .= $wpcf->conditional->render_js_show($field_name); } foreach ($failed_fields as $field_name) { $execute .= $wpcf->conditional->render_js_hide($field_name); } echo json_encode(array('output' => '', 'execute' => $execute, 'wpcf_nonce_ajax_callback' => wp_create_nonce('execute'))); } die; break; case 'cd_group_verify': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/conditional-display.php'; $group = wpcf_admin_fields_get_group($_POST['group_id']); if (empty($group)) { echo json_encode(array('output' => '')); die; } $execute = ''; $group['conditional_display'] = get_post_meta($group['id'], '_wpcf_conditional_display', true); // Filter meta values (switch them with $_POST values) add_filter('get_post_metadata', 'wpcf_cd_meta_ajax_validation_filter', 10, 4); $post = false; if (isset($_SERVER['HTTP_REFERER'])) { $split = explode('?', $_SERVER['HTTP_REFERER']); if (isset($split[1])) { parse_str($split[1], $vars); if (isset($vars['post'])) { $_POST['post_ID'] = $vars['post']; $post = get_post($vars['post']); } } } // Dummy post if (!$post) { $post = new stdClass(); $post->ID = 1; } if (!empty($group['conditional_display']['conditions'])) { $result = wpcf_cd_post_groups_filter(array(0 => $group), $post, 'group'); if (!empty($result)) { $result = array_shift($result); $passed = $result['_conditional_display'] == 'passed' ? true : false; } else { $passed = false; } if (!$passed) { $execute = 'jQuery("#' . $group['slug'] . '").slideUp().find(".wpcf-cd-group")' . '.addClass(\'wpcf-cd-group-failed\')' . '.removeClass(\'wpcf-cd-group-passed\').hide();'; } else { $execute = 'jQuery("#' . $group['slug'] . '").show().find(".wpcf-cd-group")' . '.addClass(\'wpcf-cd-group-passed\')' . '.removeClass(\'wpcf-cd-group-failed\').slideDown();'; } } // Remove filter meta values (switch them with $_POST values) remove_filter('get_post_metadata', 'wpcf_cd_meta_ajax_validation_filter', 10, 4); echo json_encode(array('output' => '', 'execute' => $execute, 'wpcf_nonce_ajax_callback' => wp_create_nonce('execute'))); break; case 'pr_verify': require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/conditional-display.php'; $passed_fields = array(); $failed_fields = array(); $post = false; if (isset($_SERVER['HTTP_REFERER'])) { $split = explode('?', $_SERVER['HTTP_REFERER']); if (isset($split[1])) { parse_str($split[1], $vars); if (isset($vars['post'])) { $_POST['post_ID'] = $vars['post']; $post = get_post($vars['post']); } } } // Dummy post if (!$post) { $post = new stdClass(); $post->ID = 1; } // Filter meta values (switch them with $_POST values) add_filter('get_post_metadata', 'wpcf_cd_pr_meta_ajax_validation_filter', 10, 4); // add_filter( 'types_field_get_submitted_data', // 'wpcf_cd_pr_meta_ajax_validation_filter', 10, 4 ); if (isset($_POST['wpcf_post_relationship'])) { $child_post_id = key($_POST['wpcf_post_relationship']); $data = $_POST['wpcf_post_relationship'] = array_shift($_POST['wpcf_post_relationship']); foreach ($data as $field_id => $field_value) { $element = array(); $field = wpcf_admin_fields_get_field(str_replace(WPCF_META_PREFIX, '', $field_id)); if (!empty($field['data']['conditional_display']['conditions'])) { $element = wpcf_cd_post_edit_field_filter($element, $field, $post, 'group'); if (isset($element['__wpcf_cd_status']) && $element['__wpcf_cd_status'] == 'passed') { $passed_fields[] = 'wpcf_post_relationship_' . $child_post_id . '_' . $field['id']; } else { $failed_fields[] = 'wpcf_post_relationship_' . $child_post_id . '_' . $field['id']; } } } } // Remove filter meta values (switch them with $_POST values) remove_filter('get_post_metadata', 'wpcf_cd_pr_meta_ajax_validation_filter', 10, 4); // remove_filter( 'types_field_get_submitted_data', // 'wpcf_cd_pr_meta_ajax_validation_filter', 10, 4 ); if (!empty($passed_fields) || !empty($failed_fields)) { $execute = ''; foreach ($passed_fields as $field_name) { $execute .= 'jQuery(\'#' . $field_name . '\').parents(\'.wpcf-cd\').show().removeClass(\'wpcf-cd-failed\').addClass(\'wpcf-cd-passed\');' . " "; } foreach ($failed_fields as $field_name) { $execute .= 'jQuery(\'#' . $field_name . '\').parents(\'.wpcf-cd\').hide().addClass(\'wpcf-cd-failed\').removeClass(\'wpcf-cd-passed\');' . " "; } echo json_encode(array('output' => '', 'execute' => $execute, 'wpcf_nonce_ajax_callback' => wp_create_nonce('execute'))); } die; break; default: break; } if (function_exists('wpcf_ajax')) { wpcf_ajax(); } die; }
/** * Gets children. * * @global type $wpdb * @param type $post * @param type $post_type * @param string $data * @return type */ function get_children($post, $post_type, $data) { if (empty($post)) { return array(); } global $wpdb; $items = array(); // TODO Warning // $repetitive_warning = false; // Cleanup data if (empty($data['fields_setting'])) { $data['fields_setting'] = 'all_cf'; } // List items if (isset($_GET['sort']) && isset($_GET['field'])) { if ($_GET['field'] == '_wp_title') { // Allow filtering $_query = 'post_type=' . $post_type . '&numberposts=-1&post_status=null&meta_key=' . '_wpcf_belongs_' . $post->post_type . '_id&meta_value=' . $post->ID . '&orderby=title&suppress_filters=0&order=' . strval($_GET['sort']); $query = apply_filters('wpcf_relationship_get_children_query', $_query, $post, $post_type, $data, esc_attr($_GET['field'])); $items = get_posts($query); } else { if ($_GET['field'] == '_wpcf_pr_parent') { /* * TODO We have two get_posts here * See different filter hooks */ // Allow filtering $_query = 'post_type=' . $post_type . '&numberposts=-1&post_status=null&meta_key=' . '_wpcf_belongs_' . $post->post_type . '_id&meta_value=' . $post->ID . '&suppress_filters=0'; $query = apply_filters('wpcf_relationship_get_children_query', $_query, $post, $post_type, $data, esc_attr($_GET['field'])); $items = get_posts($query); if (!empty($items)) { $include = array(); $additional = array(); foreach ($items as $key => $item) { $meta = get_post_meta($item->ID, '_wpcf_belongs_' . esc_attr($_GET['post_type_sort_parent']) . '_id', true); if (empty($meta)) { $additional[] = $item; continue; } $include[] = $item->ID; } if (!empty($include)) { // Allow filtering $_query = 'post_type=' . $post_type . '&numberposts=-1&post_status=null' . '&meta_key=_wpcf_belongs_' . esc_attr($_GET['post_type_sort_parent']) . '_id' . '&orderby=meta_value_num&order=' . esc_attr(strtoupper($_GET['sort'])) . '&suppress_filters=0&include=' . implode(',', $include); $query = apply_filters('wpcf_relationship_get_children_query_2', $_query, $post, $post_type, $data, esc_attr($_GET['field'])); /* * TODO Document why we overwrite it here */ $items = get_posts($query); $items = array_merge($items, $additional); } } } else { if ($_GET['field'] == '_wp_body') { // Allow filtering $_query = "\n SELECT p.ID, p.post_title, p.post_content, p.post_type\n FROM {$wpdb->posts} p\n WHERE p.post_type = %s\n AND p.post_status <> 'auto-draft'\n GROUP BY p.ID\n ORDER BY p.post_content " . esc_attr(strtoupper($_GET['sort'])); $query = apply_filters('wpcf_relationship_get_children_query', $_query, $post, $post_type, $data, esc_attr($_GET['field'])); $items = $wpdb->get_results($wpdb->prepare($query, $post_type)); } else { $field = wpcf_admin_fields_get_field(str_replace('wpcf-', '', $_GET['field'])); $orderby = isset($field['type']) && in_array($field['type'], array('numeric', 'date')) ? 'meta_value_num' : 'meta_value'; // Allow filtering $_query = 'post_type=' . $post_type . '&numberposts=-1&post_status=null&meta_key=' . '_wpcf_belongs_' . $post->post_type . '_id&meta_value=' . $post->ID . '&suppress_filters=0'; $query = apply_filters('wpcf_relationship_get_children_query', $_query, $post, $post_type, $data, esc_attr($_GET['field'])); $items = get_posts($query); if (!empty($items)) { $include = array(); $additional = array(); foreach ($items as $key => $item) { $meta = get_post_meta($item->ID, $_GET['field'], true); if (empty($meta)) { $additional[] = $item; continue; } $check = wpcf_cd_post_edit_field_filter(array(), $field, $item, 'post-relationship-sort'); if (isset($check['__wpcf_cd_status']) && $check['__wpcf_cd_status'] == 'failed') { $additional[] = $item; } else { $include[] = $item->ID; } } if (!empty($include)) { // Allow filtering $_query = 'post_type=' . $post_type . '&numberposts=-1&post_status=null&meta_key=' . $_GET['field'] . '&orderby=' . $orderby . '&order=' . esc_attr(strtoupper($_GET['sort'])) . '&suppress_filters=0&include=' . implode(',', $include); $query = apply_filters('wpcf_relationship_get_children_query_2', $_query, $post, $post_type, $data, esc_attr($_GET['field'])); /* * TODO Document why we overwrite it here */ $items = get_posts($query); $items = array_merge($items, $additional); } } } } } } else { // Allow filtering $_query = 'post_type=' . $post_type . '&numberposts=-1&post_status=null&meta_key=' . '_wpcf_belongs_' . $post->post_type . '_id&suppress_filters=0&meta_value=' . $post->ID; $query = apply_filters('wpcf_relationship_get_children_query', $_query, $post, $post_type, $data); $items = get_posts($query); } return $items; }
/** * Has form. * * @param type $post * @param type $post_type * @param type $data * @param type $parent_post_type * @return string */ function wpcf_pr_admin_post_meta_box_has_form($post, $post_type, $data, $parent_post_type) { if (empty($post)) { return ''; } global $wpdb; $output = array(); $repetitive_warning = false; // Cleanup data if (empty($data['fields_setting'])) { $data['fields_setting'] = 'all_cf'; } // List items if (isset($_GET['sort']) && isset($_GET['field'])) { if ($_GET['field'] == '_wp_title') { $items = get_posts('post_type=' . $post_type . '&numberposts=-1&post_status=null&meta_key=' . '_wpcf_belongs_' . $parent_post_type . '_id&meta_value=' . $post->ID . '&orderby=title&suppress_filters=0&order=' . $_GET['sort']); } else { if ($_GET['field'] == '_wpcf_pr_parent') { $items = get_posts('post_type=' . $post_type . '&numberposts=-1&post_status=null&meta_key=' . '_wpcf_belongs_' . $parent_post_type . '_id&meta_value=' . $post->ID . '&suppress_filters=0'); if (!empty($items)) { $include = array(); $additional = array(); foreach ($items as $key => $item) { $meta = get_post_meta($item->ID, '_wpcf_belongs_' . $_GET['post_type_sort_parent'] . '_id', true); if (empty($meta)) { $additional[] = $item; continue; } $include[] = $item->ID; } if (!empty($include)) { $items = get_posts('post_type=' . $post_type . '&numberposts=-1&post_status=null' . '&meta_key=_wpcf_belongs_' . $_GET['post_type_sort_parent'] . '_id' . '&orderby=meta_value_num&order=' . esc_attr(strtoupper($_GET['sort'])) . '&suppress_filters=0&include=' . implode(',', $include)); $items = array_merge($items, $additional); } } } else { if ($_GET['field'] == '_wp_body') { $query = "\n SELECT p.ID, p.post_title, p.post_content, p.post_type\n FROM {$wpdb->posts} p\n WHERE p.post_type = %s\n AND p.post_status <> 'auto-draft'\n GROUP BY p.ID\n ORDER BY p.post_content " . esc_attr(strtoupper($_GET['sort'])); $items = $wpdb->get_results($wpdb->prepare($query, $post_type)); } else { $field = wpcf_admin_fields_get_field(str_replace('wpcf-', '', $_GET['field'])); $orderby = isset($field['type']) && in_array($field['type'], array('numeric', 'date')) ? 'meta_value_num' : 'meta_value'; $items = get_posts('post_type=' . $post_type . '&numberposts=-1&post_status=null&meta_key=' . '_wpcf_belongs_' . $parent_post_type . '_id&meta_value=' . $post->ID . '&suppress_filters=0'); if (!empty($items)) { $include = array(); $additional = array(); foreach ($items as $key => $item) { $meta = get_post_meta($item->ID, $_GET['field'], true); if (empty($meta)) { $additional[] = $item; continue; } $check = wpcf_cd_post_edit_field_filter(array(), $field, $item, 'post-relationship-sort'); if (isset($check['__wpcf_cd_status']) && $check['__wpcf_cd_status'] == 'failed') { $additional[] = $item; } else { $include[] = $item->ID; } } if (!empty($include)) { $items = get_posts('post_type=' . $post_type . '&numberposts=-1&post_status=null&meta_key=' . $_GET['field'] . '&orderby=' . $orderby . '&order=' . esc_attr(strtoupper($_GET['sort'])) . '&suppress_filters=0&include=' . implode(',', $include)); $items = array_merge($items, $additional); } } } } } } else { $items = get_posts('post_type=' . $post_type . '&numberposts=-1&post_status=null&meta_key=' . '_wpcf_belongs_' . $parent_post_type . '_id&suppress_filters=0&meta_value=' . $post->ID); } // Pagination $total_items = count($items); $per_page = 5; $page = isset($_GET['page']) ? intval($_GET['page']) : 1; $numberposts = $page == 1 ? 1 : ($page - 1) * $per_page; $slice = $page == 1 ? 0 : ($page - 1) * $per_page; $next = count($items) >= $numberposts + $per_page; $prev = $page == 1 ? false : true; if ($total_items > $per_page) { $items = array_splice($items, $slice, $per_page); } $headers = wpcf_pr_admin_post_meta_box_has_form_headers($post, $post_type, $parent_post_type, $data); // If headers are empty, that means there is nothing to render if (empty($headers)) { return ''; } $header = '<thead><tr><th class="wpcf-sortable">' . implode(' </th><th class="wpcf-sortable">', $headers) . ' </th><th>' . __('Action', 'wpcf') . '</th></tr></thead>'; foreach ($items as $key => $item) { $output[] = wpcf_pr_admin_post_meta_box_has_row($post, $post_type, $data, $parent_post_type, $item, $headers); } $return = ''; $return .= $repetitive_warning ? '<div class="wpcf-message wpcf-error"><p>' . __('Repeating fields should not be used in child posts. Types will update all field values.', 'wpcf') . '</p></div>' : ''; $return .= wpcf_pr_admin_has_pagination($post, $post_type, $page, $prev, $next, $per_page, $total_items); $return .= '<div class="wpcf-pr-table-wrapper"><table id="wpcf_pr_table_sortable_' . md5($post_type) . '" class="tablesorter wpcf_pr_table_sortable"' . ' cellpadding="0" cellspacing="0" style="width:100%;">' . $header . '<tbody>' . implode($output) . '</tbody></table></div>'; $return .= wpcf_form_render_js_validation('#post', false); return $return; }