/** * Apply the filter. * * @param mixed input: an integer, an array of integers, or a JSON string representing an array of integers. * @param string optional formatting tpl * @return mixed */ public function filter($input, $options = null) { $required_functions = array('getimagesize', 'imagecreatefromjpeg', 'imagecreatefromgif', 'imagecreatefrompng'); foreach ($required_functions as $f) { if (!function_exists($f)) { return sprintf(__('Missing required function %s'), '<code>' . $f . '</code>'); } } require_once CCTM_PATH . '/includes/SummarizePosts.php'; require_once CCTM_PATH . '/includes/GetPostsQuery.php'; $tpl = '<div class="cctm_gallery" id="cctm_gallery_[+i+]"><img height="[+height+]" width="[+width+]" src="[+guid+]" title="[+post_title+]" alt="[+alt+]" class="cctm_image" id="cctm_image_[+i+]"/></div>'; if (!empty($options)) { $tpl = $options; } if (empty($input)) { return ''; } $inputs = $this->to_array($input); $Q = new GetPostsQuery(); $Q->set_include_hidden_fields(true); // We can't use $Q->get_posts() because MySQL will return results in an arbitrary order. boo. $output = ''; $i = 1; foreach ($inputs as $image_id) { $r = $Q->get_post($image_id); // Translate $r['post_title'] = __($r['post_title']); $r['post_content'] = __($r['post_content']); $r['post_excerpt'] = __($r['post_excerpt']); $image_info = getimagesize($r['guid']); $image_type = $image_info[2]; if ($image_type == IMAGETYPE_JPEG) { $this_image = imagecreatefromjpeg($r['guid']); } elseif ($image_type == IMAGETYPE_GIF) { $this_image = imagecreatefromgif($r['guid']); } elseif ($image_type == IMAGETYPE_PNG) { $this_image = imagecreatefrompng($r['guid']); } if (isset($r['_wp_attachment_image_alt'])) { $r['alt'] = $r['_wp_attachment_image_alt']; } $r['i'] = $i; $r['width'] = imagesx($this_image); $r['height'] = imagesy($this_image); $output .= CCTM::parse($tpl, $r); $i++; } return $output; }
if (isset($GLOBALS['wp_post_types'][$post_type]->cap->edit_posts)) { $cap = $GLOBALS['wp_post_types'][$post_type]->cap->edit_posts; } if (!current_user_can($cap)) { die('<pre>You do not have permission to do that.</pre>'); } require_once CCTM_PATH . '/includes/GetPostsQuery.php'; //print '<div>'. print_r($_POST, true).'</div>'; $post_id = CCTM::get_value($_POST, 'post_id'); $target_id = CCTM::get_value($_POST, 'target_id'); // Will be either the single or the multi, depending. $tpl = ''; $tpl = CCTM::load_tpl('widgets/post_item.tpl'); // Just in case... if (empty($tpl)) { print '<p>' . __('Formatting template not found!', CCTM_TXTDOMAIN) . '</p>'; return; } $Q = new GetPostsQuery(); $post = $Q->get_post($post_id); $post['edit_selected_post_label'] = __('Edit Selected Post', CCTM_TXTDOMAIN); $post_type = $post['post_type']; $post['post_icon'] = CCTM::get_thumbnail($post_id); if ($post_type == 'attachment') { $post['edit_url'] = get_admin_url('', 'media.php') . "?attachment_id={$post_id}&action=edit"; } else { $post['edit_url'] = get_admin_url('', 'post.php') . "?post={$post_id}&action=edit"; } $post['target_id'] = $target_id; print CCTM::parse($tpl, $post); /*EOF*/
/** * We use this to print out the large icon at the top of the page when editing a post/page * and to enforce field validation (including required fields). * http://code.google.com/p/wordpress-custom-content-type-manager/issues/detail?id=188 * https://code.google.com/p/wordpress-custom-content-type-manager/issues/detail?id=544 */ public static function print_admin_header() { $file = substr($_SERVER['SCRIPT_NAME'], strrpos($_SERVER['SCRIPT_NAME'], '/') + 1); if (!in_array($file, array('post.php', 'post-new.php', 'edit.php'))) { return; } $post_type = CCTM::get_value($_GET, 'post_type'); if (empty($post_type)) { $post_id = (int) CCTM::get_value($_GET, 'post'); if (empty($post_id)) { return; } $post = get_post($post_id); $post_type = $post->post_type; } // Only do this stuff for active post-types (is_active can be 1 for built-in or 2 for foreign) if (!isset(CCTM::$data['post_type_defs'][$post_type]['is_active']) || !CCTM::$data['post_type_defs'][$post_type]['is_active']) { return; } // Show the big icon: http://code.google.com/p/wordpress-custom-content-type-manager/issues/detail?id=136 if (isset(CCTM::$data['post_type_defs'][$post_type]['use_default_menu_icon']) && CCTM::$data['post_type_defs'][$post_type]['use_default_menu_icon'] == 0) { $baseimg = basename(CCTM::$data['post_type_defs'][$post_type]['menu_icon']); // die($baseimg); if (file_exists(CCTM_PATH . '/images/icons/32x32/' . $baseimg)) { printf(' <style> #icon-edit, #icon-post { background-image:url(%s); background-position: 0px 0px; } </style>', CCTM_URL . '/images/icons/32x32/' . $baseimg); } } // Validate the custom fields when a page is first printed (e.g. the validation rule was // created or updated, then the post is edited) $file = substr($_SERVER['SCRIPT_NAME'], strrpos($_SERVER['SCRIPT_NAME'], '/') + 1); if (in_array($file, array('post.php'))) { global $post; $Q = new GetPostsQuery(); $full_post = $Q->get_post($post->ID); if (!self::validate_fields($post_type, $full_post)) { // Print any validation errors. $output = '<div class="error"><img src="' . CCTM_URL . '/images/warning-icon.png" width="50" height="44" style="float:left; padding:10px; vertical-align:middle;"/><p style=""><strong>' . __('This post has validation errors. The post will remain in draft status until they are corrected.', CCTM_TXTDOMAIN) . '</strong></p> <ul style="clear:both;">'; foreach (CCTM::$post_validation_errors as $fieldname => $e) { $output .= '<li>' . $e . '</li>'; } $output .= '</ul></div>'; // You have to print the style because WP overrides styles after the cctm manager.css is included. // This isn't helpful during the admin head event because you'd have to also check validation at the time when // the fields are printed in print_custom_fields(), which fires later on. // We can use this variable to pass data to a point later in the page request. // global $cctm_validation; // CCTM::$errors // CCTM::$errors['my_field'] = 'This is the validation error with that field'; $output .= '<style>'; $output .= file_get_contents(CCTM_PATH . '/css/validation.css'); $output .= '</style>'; print $output; // Override!! set post to draft status if there were validation errors. // See https://code.google.com/p/wordpress-custom-content-type-manager/issues/detail?id=544 global $wpdb; $post_id = (int) CCTM::get_value($_GET, 'post'); $wpdb->update($wpdb->posts, array('post_status' => 'draft'), array('ID' => $post_id), array('%s'), array('%d')); } } }
/** * Process the $args to something GetPostsQuery. */ function widget($args, $instance) { // Avoid placing empty widgets if (!isset($instance['post_id']) || empty($instance['post_id'])) { return; } require_once CCTM_PATH . '/includes/GetPostsQuery.php'; $post_id = (int) $instance['post_id']; $Q = new GetPostsQuery(); $post = $Q->get_post($post_id); $post['post_content'] = do_shortcode(wpautop($post['post_content'])); $output = $args['before_widget']; if (isset($instance['override_title']) && $instance['override_title'] == 1) { $title = $instance['title']; } else { $title = $post['post_title']; // default is to use the post's title } if (!empty($title)) { $output .= $args['before_title'] . $title . $args['after_title']; } if (!empty($instance['formatting_string'])) { $output .= CCTM::parse($instance['formatting_string'], $post); } else { $output .= $post['post_content']; } $output .= $args['after_widget']; print $output; }
/** * * * @param mixed $current_value current value for this field (an integer ID). * @return string */ public function get_edit_field_instance($current_value) { require_once CCTM_PATH . '/includes/GetPostsQuery.php'; $Q = new GetPostsQuery(); // Populate the values (i.e. properties) of this field $this->id = str_replace(array('[', ']', ' '), '_', $this->name); $this->content = ''; if (empty($this->button_label)) { $this->button_label = __('Choose Relation', CCTM_TXTDOMAIN); } $this->post_id = $this->value; $fieldtpl = ''; $wrappertpl = ''; // Multi field? if ($this->is_repeatable) { $this->remove_label = __('Remove All'); $fieldtpl = CCTM::load_tpl(array('fields/elements/' . $this->name . '.tpl', 'fields/elements/_relation_multi.tpl')); $wrappertpl = CCTM::load_tpl(array('fields/wrappers/' . $this->name . '.tpl', 'fields/wrappers/_relation_multi.tpl')); $values = $this->get_value($current_value, 'to_array'); foreach ($values as $v) { $hash = $this->get_props(); $hash['post_id'] = (int) $v; $hash['thumbnail_url'] = CCTM::get_thumbnail($hash['post_id']); // Look up all the data on that foreign key // We gotta watch out: what if the related post has custom fields like "description" or // anything that would conflict with the definition? $post = $Q->get_post($hash['post_id']); if (empty($post)) { $this->content .= '<div class="cctm_error"><p>' . sprintf(__('Post %s not found.', CCTM_TXTDOMAIN), $v) . '</p></div>'; } else { foreach ($post as $k => $v) { // Don't override the def's attributes! if (!isset($hash[$k])) { $hash[$k] = $v; } } $this->content .= CCTM::parse($fieldtpl, $hash); } } } else { $this->remove_label = __('Remove'); $this->post_id = $this->get_value($current_value, 'to_string'); $this->thumbnail_url = CCTM::get_thumbnail($this->post_id); $fieldtpl = CCTM::load_tpl(array('fields/elements/' . $this->name . '.tpl', 'fields/elements/_relation.tpl')); $wrappertpl = CCTM::load_tpl(array('fields/wrappers/' . $this->name . '.tpl', 'fields/wrappers/_relation.tpl')); if ($this->post_id) { // Look up all the data on that foriegn key // We gotta watch out: what if the related post has custom fields like "description" or // anything that would conflict with the definition? $post = $Q->get_post($this->post_id); if (empty($post)) { $this->content = '<div class="cctm_error"><p>' . sprintf(__('Post %s not found.', CCTM_TXTDOMAIN), $this->post_id) . '</p></div>'; } else { foreach ($post as $k => $v) { // Don't override the def's attributes! if (!isset($this->{$k})) { $this->{$k} = $v; } } $this->content = CCTM::parse($fieldtpl, $this->get_props()); } } } if (empty($this->button_label)) { $this->button_label = __('Choose Relation', CCTM_TXTDOMAIN); } return CCTM::parse($wrappertpl, $this->get_props()); }
/** * Callback function used by the cctm_post_form() function. This is what gets * called * * @param array $args: parameters from the shortcode and posted data * @return string (printed) */ public static function post_form_handler($args) { //return print_r($args,true); // Strip out the control stuff (keys begin with underscore) $vals = array(); foreach ($args as $k => $v) { if ($k[0] == '_') { continue; } $vals[$k] = $v; } // Insert into Database $email_only = CCTM::get_value($args, '_email_only'); if (!$email_only) { require_once CCTM_PATH . '/includes/SP_Post.php'; $P = new SP_Post(); CCTM::$post_id = $P->insert($vals); } // Email stuff if (isset($args['_email_to']) && !empty($args['_email_to']) && isset($args['_email_tpl']) && !empty($args['_email_tpl'])) { $Q = new GetPostsQuery(); $P = $Q->get_post($args['_email_tpl']); //return print_r($P, true); $subject = $P['post_title']; $message_tpl = wpautop($P['post_content']); // If the 'My User' <*****@*****.**> format is used, we have to manipulate the string // to keep WP from tripping over itself $from = CCTM::get_value($args, '_email_from', get_bloginfo('admin_email')); $from = str_replace(array(''', '"', '"', '<', '>'), array("'", '"', '"', '<', '>'), $from); // die(print_r($args,true)); $subject = CCTM::get_value($args, '_email_subject', $subject); $headers = 'From: ' . $from . "\r\n"; $headers .= 'content-type: text/html' . "\r\n"; $message = CCTM::parse($message_tpl, $vals); if (!wp_mail($args['_email_to'], $subject, $message, $headers)) { return "There was a problem sending the email."; } } // Redirect or show a simple message. $redirect = CCTM::get_value($args, '_redirect'); if ($redirect) { $url = get_permalink($redirect); CCTM::redirect($url, true); } // Else, return message: return CCTM::get_value($args, '_msg', "Thanks for submitting the form!"); }
/** * * * @param mixed $current_value current value for this field (an integer ID). * @return string */ public function get_edit_field_instance($current_value) { require_once CCTM_PATH . '/includes/GetPostsQuery.php'; $Q = new GetPostsQuery(); // Populate the values (i.e. properties) of this field $this->id = str_replace(array('[', ']', ' '), '_', $this->name); $this->content = ''; if (empty($this->button_label)) { $this->button_label = __('Choose Relation', CCTM_TXTDOMAIN); } $this->post_id = $this->value; $fieldtpl = ''; $wrappertpl = ''; $relationmeta_tpl = CCTM::load_tpl(array('fields/options/' . $this->name . '.tpl', 'fields/options/_relationmeta.tpl')); // Multi field? if ($this->is_repeatable) { $fieldtpl = CCTM::load_tpl(array('fields/elements/' . $this->name . '.tpl', 'fields/elements/_relationmeta_multi.tpl')); $wrappertpl = CCTM::load_tpl(array('fields/wrappers/' . $this->name . '.tpl', 'fields/wrappers/_relationmeta_multi.tpl', 'fields/wrappers/_relation_multi.tpl')); } else { $fieldtpl = CCTM::load_tpl(array('fields/elements/' . $this->name . '.tpl', 'fields/elements/_relationmeta.tpl')); $wrappertpl = CCTM::load_tpl(array('fields/wrappers/' . $this->name . '.tpl', 'fields/wrappers/_relation.tpl')); } $data = $this->get_value($current_value, 'ignored'); if ($data) { foreach ($data as $post_id => $metafields) { // Look up all the data on those foriegn keys // We gotta watch out: what if the related post has custom fields like "description" or // anything that would conflict with the definition? // I'm using $post as my hash for $fieldtpl... I think $wrappertpl is what I need to watch out for. $post = $Q->get_post($post_id); $post['thumbnail_url'] = CCTM::get_thumbnail($post_id); if (empty($post)) { $this->content = '<div class="cctm_error"><p>' . sprintf(__('Post %s not found.', CCTM_TXTDOMAIN), $post_id) . '</p></div>'; } else { // Warning: $metafields that is set on this post may not containt fields // that were newly added to the def, so we flesh it out from the $this->metafields def. $content = ''; if (is_array($this->metafields)) { foreach ($this->metafields as $mf) { if (!isset($metafields[$mf])) { $metafields[$mf] = ''; } } } // Look up data for each of the metafields foreach ($metafields as $mf => $v) { if (!isset(CCTM::$data['custom_field_defs'][$mf])) { continue; } $d = CCTM::$data['custom_field_defs'][$mf]; if (!($FieldObj = CCTM::load_object($d['type'], 'fields'))) { continue; } $d['name'] = $this->name . '[' . $post_id . '][' . $d['name'] . ']'; $d['value'] = $v; $d['is_repeatable'] = false; // override $FieldObj->set_props($d); $output_this_field = $FieldObj->get_edit_field_instance($v); $content .= CCTM::parse($relationmeta_tpl, array('content' => $output_this_field)); } $post['metafields'] = $content; $this->content .= CCTM::parse($fieldtpl, $post); } } // endforeach } // end $data if (empty($this->button_label)) { $this->button_label = __('Choose Relation', CCTM_TXTDOMAIN); } return CCTM::parse($wrappertpl, $this->get_props()); }
/** * Retrieves a complete post object, including all meta fields. It avoids the * standard WP functions get_post() and get_post_custom() because they encountered * some weird issues with conflicting global variables (?): * http://codex.wordpress.org/Function_Reference/get_post * http://codex.wordpress.org/Function_Reference/get_post_custom * * Returned is a post array that contains a key for each field and custom field, e.g. * * print $post['post_title']; * print $post['my_custom_field']; // not $post['my_custom_fields'][0]; * * and if the custom field *is* a list of items, then attach it as such. * * @param integer $id is valid ID of a post (regardless of post_type). * @return array associative array of post with all attributes, including custom fields. */ function get_post_complete($id) { $Q = new GetPostsQuery(); return $Q->get_post($id); }