summaryrefslogtreecommitdiffstats
path: root/wp-includes/post.php
diff options
context:
space:
mode:
authordonncha <donncha@7be80a69-a1ef-0310-a953-fb0f7c49ff36>2007-10-12 16:21:15 +0000
committerdonncha <donncha@7be80a69-a1ef-0310-a953-fb0f7c49ff36>2007-10-12 16:21:15 +0000
commit3a4570b0fc8b3d6339bef71d17d7701554e0bbf7 (patch)
tree2a06e5261263c68d8afd95a6328879dc289cb909 /wp-includes/post.php
parentb83c34a7010faee0223f6037025c350da12e05e6 (diff)
downloadwordpress-mu-3a4570b0fc8b3d6339bef71d17d7701554e0bbf7.tar.gz
wordpress-mu-3a4570b0fc8b3d6339bef71d17d7701554e0bbf7.tar.xz
wordpress-mu-3a4570b0fc8b3d6339bef71d17d7701554e0bbf7.zip
Merge with WP 2.3 - testing use only!
Move pluggable functions out of wpmu-functions and into pluggable.php, fixes #439 git-svn-id: http://svn.automattic.com/wordpress-mu/trunk@1069 7be80a69-a1ef-0310-a953-fb0f7c49ff36
Diffstat (limited to 'wp-includes/post.php')
-rw-r--r--wp-includes/post.php692
1 files changed, 486 insertions, 206 deletions
diff --git a/wp-includes/post.php b/wp-includes/post.php
index db0472d..f23ba32 100644
--- a/wp-includes/post.php
+++ b/wp-includes/post.php
@@ -28,22 +28,24 @@ function update_attached_file( $attachment_id, $file ) {
function &get_children($args = '', $output = OBJECT) {
global $post_cache, $wpdb, $blog_id;
- if ( empty($args) ) {
- if ( isset($GLOBALS['post']) )
- $r = array('post_parent' => & $GLOBALS['post']->post_parent);
- else
+ if ( empty( $args ) ) {
+ if ( isset( $GLOBALS['post'] ) ) {
+ $args = 'post_parent=' . (int) $GLOBALS['post']->post_parent;
+ } else {
return false;
- } elseif ( is_object($args) )
- $r = array('post_parent' => $post->post_parent);
- elseif ( is_numeric($args) )
- $r = array('post_parent' => $args);
- elseif ( is_array($args) )
- $r = &$args;
- else
- parse_str($args, $r);
+ }
+ } elseif ( is_object( $args ) ) {
+ $args = 'post_parent=' . (int) $args->post_parent;
+ } elseif ( is_numeric( $args ) ) {
+ $args = 'post_parent=' . (int) $args;
+ }
+
+ $defaults = array(
+ 'numberposts' => -1, 'post_type' => '',
+ 'post_status' => '', 'post_parent' => 0
+ );
- $defaults = array('numberposts' => -1, 'post_type' => '', 'post_status' => '', 'post_parent' => 0);
- $r = array_merge($defaults, $r);
+ $r = wp_parse_args( $args, $defaults );
$children = get_posts( $r );
@@ -90,7 +92,7 @@ function get_extended($post) {
// Retrieves post data given a post ID or post object.
// Handles post caching.
-function &get_post(&$post, $output = OBJECT) {
+function &get_post(&$post, $output = OBJECT, $filter = 'raw') {
global $post_cache, $wpdb, $blog_id;
if ( empty($post) ) {
@@ -122,6 +124,8 @@ function &get_post(&$post, $output = OBJECT) {
if ( defined('WP_IMPORTING') )
unset($post_cache[$blog_id]);
+ $_post = sanitize_post($_post, $filter);
+
if ( $output == OBJECT ) {
return $_post;
} elseif ( $output == ARRAY_A ) {
@@ -133,6 +137,22 @@ function &get_post(&$post, $output = OBJECT) {
}
}
+function get_post_field( $field, $post, $context = 'display' ) {
+ $post = (int) $post;
+ $post = get_post( $post );
+
+ if ( is_wp_error($post) )
+ return $post;
+
+ if ( !is_object($post) )
+ return '';
+
+ if ( !isset($post->$field) )
+ return '';
+
+ return sanitize_post_field($field, $post->$field, $post->ID, $context);
+}
+
// Takes a post ID, returns its mime type.
function get_post_mime_type($ID = '') {
$post = & get_post($ID);
@@ -173,16 +193,18 @@ function get_post_type($post = false) {
function get_posts($args) {
global $wpdb;
- if ( is_array($args) )
- $r = &$args;
- else
- parse_str($args, $r);
+ $defaults = array(
+ 'numberposts' => 5, 'offset' => 0,
+ 'category' => 0, 'orderby' => 'post_date',
+ 'order' => 'DESC', 'include' => '',
+ 'exclude' => '', 'meta_key' => '',
+ 'meta_value' =>'', 'post_type' => 'post',
+ 'post_status' => 'publish', 'post_parent' => 0
+ );
+
+ $r = wp_parse_args( $args, $defaults );
+ extract( $r, EXTR_SKIP );
- $defaults = array('numberposts' => 5, 'offset' => 0, 'category' => 0,
- 'orderby' => 'post_date', 'order' => 'DESC', 'include' => '', 'exclude' => '',
- 'meta_key' => '', 'meta_value' =>'', 'post_type' => 'post', 'post_status' => 'publish', 'post_parent' => 0);
- $r = array_merge($defaults, $r);
- extract($r, EXTR_SKIP);
$numberposts = (int) $numberposts;
$offset = (int) $offset;
$category = (int) $category;
@@ -226,13 +248,13 @@ function get_posts($args) {
$exclusions .= ')';
$query = "SELECT DISTINCT * FROM $wpdb->posts ";
- $query .= empty( $category ) ? '' : ", $wpdb->post2cat ";
+ $query .= empty( $category ) ? '' : ", $wpdb->term_relationships, $wpdb->term_taxonomy ";
$query .= empty( $meta_key ) ? '' : ", $wpdb->postmeta ";
$query .= " WHERE 1=1 ";
$query .= empty( $post_type ) ? '' : "AND post_type = '$post_type' ";
$query .= empty( $post_status ) ? '' : "AND post_status = '$post_status' ";
$query .= "$exclusions $inclusions " ;
- $query .= empty( $category ) ? '' : "AND ($wpdb->posts.ID = $wpdb->post2cat.post_id AND $wpdb->post2cat.category_id = " . $category. ") ";
+ $query .= empty( $category ) ? '' : "AND ($wpdb->posts.ID = $wpdb->term_relationships.object_id AND $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id AND $wpdb->term_taxonomy.term_id = " . $category. ") ";
$query .= empty( $post_parent ) ? '' : "AND $wpdb->posts.post_parent = '$post_parent' ";
$query .= empty( $meta_key ) | empty($meta_value) ? '' : " AND ($wpdb->posts.ID = $wpdb->postmeta.post_id AND $wpdb->postmeta.meta_key = '$meta_key' AND $wpdb->postmeta.meta_value = '$meta_value' )";
$query .= " GROUP BY $wpdb->posts.ID ORDER BY " . $orderby . ' ' . $order;
@@ -363,6 +385,17 @@ function update_post_meta($post_id, $key, $value, $prev_value = '') {
}
+function delete_post_meta_by_key($post_meta_key) {
+ global $wpdb, $post_meta_cache, $blog_id;
+ $post_meta_key = $wpdb->escape($post_meta_key);
+ if ( $wpdb->query("DELETE FROM $wpdb->postmeta WHERE meta_key = '$post_meta_key'") ) {
+ unset($post_meta_cache[$blog_id]); // not worth doing the work to iterate through the cache
+ return true;
+ }
+ return false;
+}
+
+
function get_post_custom($post_id = 0) {
global $id, $post_meta_cache, $wpdb, $blog_id;
@@ -394,6 +427,81 @@ function get_post_custom_values( $key = '', $post_id = 0 ) {
return $custom[$key];
}
+function sanitize_post($post, $context = 'display') {
+ // TODO: Use array keys instead of hard coded list
+ $fields = array('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_date', 'post_date_gmt', 'post_parent', 'menu_order', 'post_mime_type', 'post_category');
+
+ $do_object = false;
+ if ( is_object($post) )
+ $do_object = true;
+
+ foreach ( $fields as $field ) {
+ if ( $do_object )
+ $post->$field = sanitize_post_field($field, $post->$field, $post->ID, $context);
+ else
+ $post[$field] = sanitize_post_field($field, $post[$field], $post['ID'], $context);
+ }
+
+ return $post;
+}
+
+function sanitize_post_field($field, $value, $post_id, $context) {
+ $int_fields = array('ID', 'post_parent', 'menu_order');
+ if ( in_array($field, $int_fields) )
+ $value = (int) $value;
+
+ if ( 'raw' == $context )
+ return $value;
+
+ $prefixed = false;
+ if ( false !== strpos($field, 'post_') ) {
+ $prefixed = true;
+ $field_no_prefix = str_replace('post_', '', $field);
+ }
+
+ if ( 'edit' == $context ) {
+ $format_to_edit = array('post_content', 'post_excerpt', 'post_title', 'post_password');
+
+ if ( $prefixed ) {
+ $value = apply_filters("edit_$field", $value, $post_id);
+ // Old school
+ $value = apply_filters("${field_no_prefix}_edit_pre", $value, $post_id);
+ } else {
+ $value = apply_filters("edit_post_$field", $value, $post_id);
+ }
+
+ if ( in_array($field, $format_to_edit) ) {
+ if ( 'post_content' == $field )
+ $value = format_to_edit($value, user_can_richedit());
+ else
+ $value = format_to_edit($value);
+ } else {
+ $value = attribute_escape($value);
+ }
+ } else if ( 'db' == $context ) {
+ if ( $prefixed ) {
+ $value = apply_filters("pre_$field", $value);
+ $value = apply_filters("${field_no_prefix}_save_pre", $value);
+ } else {
+ $value = apply_filters("pre_post_$field", $value);
+ $value = apply_filters("${field}_pre", $value);
+ }
+ } else {
+ // Use display filters by default.
+ if ( $prefixed )
+ $value = apply_filters($field, $value, $post_id, $context);
+ else
+ $value = apply_filters("post_$field", $value, $post_id, $context);
+ }
+
+ if ( 'attribute' == $context )
+ $value = attribute_escape($value);
+ else if ( 'js' == $context )
+ $value = js_escape($value);
+
+ return $value;
+}
+
function wp_delete_post($postid = 0) {
global $wpdb, $wp_rewrite;
$postid = (int) $postid;
@@ -406,16 +514,8 @@ function wp_delete_post($postid = 0) {
do_action('delete_post', $postid);
- if ( 'publish' == $post->post_status && 'post' == $post->post_type ) {
- $categories = wp_get_post_categories($post->ID);
- if( is_array( $categories ) ) {
- foreach ( $categories as $cat_id ) {
- $wpdb->query("UPDATE $wpdb->categories SET category_count = category_count - 1 WHERE cat_ID = '$cat_id'");
- wp_cache_delete($cat_id, 'category');
- do_action('edit_category', $cat_id);
- }
- }
- }
+ // TODO delete for pluggable post taxonomies too
+ wp_delete_object_term_relationships($postid, array('category', 'post_tag'));
if ( 'page' == $post->post_type )
$wpdb->query("UPDATE $wpdb->posts SET post_parent = $post->post_parent WHERE post_parent = $postid AND post_type = 'page'");
@@ -426,8 +526,6 @@ function wp_delete_post($postid = 0) {
$wpdb->query("DELETE FROM $wpdb->comments WHERE comment_post_ID = $postid");
- $wpdb->query("DELETE FROM $wpdb->post2cat WHERE post_id = $postid");
-
$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id = $postid");
if ( 'page' == $post->post_type ) {
@@ -436,18 +534,29 @@ function wp_delete_post($postid = 0) {
}
do_action('deleted_post', $postid);
-
+
return $post;
}
-function wp_get_post_categories($post_id = 0) {
+function wp_get_post_categories( $post_id = 0, $args = array() ) {
+ $post_id = (int) $post_id;
+
+ $defaults = array('fields' => 'ids');
+ $args = wp_parse_args( $args, $defaults );
+
+ $cats = wp_get_object_terms($post_id, 'category', $args);
+ return $cats;
+}
+
+function wp_get_post_tags( $post_id = 0, $args = array() ) {
$post_id = (int) $post_id;
- $cats = &get_the_category($post_id);
- $cat_ids = array();
- foreach ( $cats as $cat )
- $cat_ids[] = (int) $cat->cat_ID;
- return array_unique($cat_ids);
+ $defaults = array('fields' => 'all');
+ $args = wp_parse_args( $args, $defaults );
+
+ $tags = wp_get_object_terms($post_id, 'post_tag', $args);
+
+ return $tags;
}
function wp_get_recent_posts($num = 10) {
@@ -472,12 +581,14 @@ function wp_get_single_post($postid = 0, $mode = OBJECT) {
$post = get_post($postid, $mode);
- // Set categories
+ // Set categories and tags
if($mode == OBJECT) {
$post->post_category = wp_get_post_categories($postid);
+ $post->tags_input = wp_get_post_tags($postid, array('fields' => 'names'));
}
else {
$post['post_category'] = wp_get_post_categories($postid);
+ $post['tags_input'] = wp_get_post_tags($postid, array('fields' => 'names'));
}
return $post;
@@ -486,8 +597,12 @@ function wp_get_single_post($postid = 0, $mode = OBJECT) {
function wp_insert_post($postarr = array()) {
global $wpdb, $wp_rewrite, $allowedtags, $user_ID;
- if ( is_object($postarr) )
- $postarr = get_object_vars($postarr);
+ $defaults = array('post_status' => 'draft', 'post_type' => 'post', 'post_author' => $user_ID,
+ 'ping_status' => get_option('default_ping_status'), 'post_parent' => 0,
+ 'menu_order' => 0, 'to_ping' => '', 'pinged' => '', 'post_password' => '');
+
+ $postarr = wp_parse_args($postarr, $defaults);
+ $postarr = sanitize_post($postarr, 'db');
// export array as variables
extract($postarr, EXTR_SKIP);
@@ -496,21 +611,9 @@ function wp_insert_post($postarr = array()) {
$update = false;
if ( !empty($ID) ) {
$update = true;
- $post = & get_post($ID);
- $previous_status = $post->post_status;
- }
-
- // Get the basics.
- if ( empty($no_filter) ) {
- $post_content = apply_filters('content_save_pre', $post_content);
- $post_content_filtered = apply_filters('content_filtered_save_pre', $post_content_filtered);
- $post_excerpt = apply_filters('excerpt_save_pre', $post_excerpt);
- $post_title = apply_filters('title_save_pre', $post_title);
- $post_category = apply_filters('category_save_pre', $post_category);
- $post_status = apply_filters('status_save_pre', $post_status);
- $post_name = apply_filters('name_save_pre', $post_name);
- $comment_status = apply_filters('comment_status_pre', $comment_status);
- $ping_status = apply_filters('ping_status_pre', $ping_status);
+ $previous_status = get_post_field('post_status', $ID);
+ } else {
+ $previous_status = 'new';
}
if ( ('' == $post_content) && ('' == $post_title) && ('' == $post_excerpt) )
@@ -520,7 +623,6 @@ function wp_insert_post($postarr = array()) {
if (0 == count($post_category) || !is_array($post_category)) {
$post_category = array(get_option('default_category'));
}
- $post_cat = $post_category[0];
if ( empty($post_author) )
$post_author = $user_ID;
@@ -544,15 +646,14 @@ function wp_insert_post($postarr = array()) {
$post_name = sanitize_title($post_name);
}
-
// If the post date is empty (due to having been new or a draft) and status is not 'draft', set date to now
if (empty($post_date)) {
- if ( 'draft' != $post_status )
+ if ( !in_array($post_status, array('draft', 'pending')) )
$post_date = current_time('mysql');
}
if (empty($post_date_gmt)) {
- if ( 'draft' != $post_status )
+ if ( !in_array($post_status, array('draft', 'pending')) )
$post_date_gmt = get_gmt_from_date($post_date);
}
@@ -570,8 +671,6 @@ function wp_insert_post($postarr = array()) {
}
if ( empty($ping_status) )
$ping_status = get_option('default_ping_status');
- if ( empty($post_pingback) )
- $post_pingback = get_option('default_pingback_flag');
if ( isset($to_ping) )
$to_ping = preg_replace('|\s+|', "\n", $to_ping);
@@ -600,7 +699,7 @@ function wp_insert_post($postarr = array()) {
if ($post_name_check || in_array($post_name, $wp_rewrite->feeds) ) {
$suffix = 2;
do {
- $alt_post_name = $post_name . "-$suffix";
+ $alt_post_name = substr($post_name, 0, 200-(strlen($suffix)+1)). "-$suffix";
$post_name_check = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$alt_post_name' AND post_type = '$post_type' AND ID != '$post_ID' AND post_parent = '$post_parent' LIMIT 1");
$suffix++;
} while ($post_name_check);
@@ -645,11 +744,11 @@ function wp_insert_post($postarr = array()) {
$wpdb->query( "UPDATE $wpdb->posts SET post_name = '$post_name' WHERE ID = '$post_ID'" );
}
- wp_set_post_categories($post_ID, $post_category);
+ wp_set_post_categories( $post_ID, $post_category );
+ wp_set_post_tags( $post_ID, $tags_input );
if ( 'page' == $post_type ) {
clean_page_cache($post_ID);
- $wp_rewrite->flush_rules();
} else {
clean_post_cache($post_ID);
}
@@ -658,55 +757,17 @@ function wp_insert_post($postarr = array()) {
if ( ! $update )
$wpdb->query("UPDATE $wpdb->posts SET guid = '" . get_permalink($post_ID) . "' WHERE ID = '$post_ID'");
- if ( $update) {
- if ($previous_status != 'publish' && $post_status == 'publish') {
- // Reset GUID if transitioning to publish.
- $wpdb->query("UPDATE $wpdb->posts SET guid = '" . get_permalink($post_ID) . "' WHERE ID = '$post_ID'");
- do_action('private_to_published', $post_ID);
- }
-
- do_action('edit_post', $post_ID);
- }
-
- if ($post_status == 'publish' && $post_type == 'post') {
- do_action('publish_post', $post_ID);
- if ( defined('XMLRPC_REQUEST') )
- do_action('xmlrpc_publish_post', $post_ID);
- if ( defined('APP_REQUEST') )
- do_action('app_publish_post', $post_ID);
-
- if ( !defined('WP_IMPORTING') ) {
- if ( $post_pingback )
- $result = $wpdb->query("
- INSERT INTO $wpdb->postmeta
- (post_id,meta_key,meta_value)
- VALUES ('$post_ID','_pingme','1')
- ");
- $result = $wpdb->query("
- INSERT INTO $wpdb->postmeta
- (post_id,meta_key,meta_value)
- VALUES ('$post_ID','_encloseme','1')
- ");
- wp_schedule_single_event(time(), 'do_pings');
- }
- } else if ($post_type == 'page') {
- if ( !empty($page_template) )
- if ( ! update_post_meta($post_ID, '_wp_page_template', $page_template))
- add_post_meta($post_ID, '_wp_page_template', $page_template, true);
-
- if ( $post_status == 'publish' )
- do_action('publish_page', $post_ID);
- }
+ $post = get_post($post_ID);
+ if ( !empty($page_template) )
+ $post->page_template = $page_template;
- // Always clears the hook in case the post status bounced from future to draft.
- wp_clear_scheduled_hook('publish_future_post', $post_ID);
+ wp_transition_post_status($post_status, $previous_status, $post);
- // Schedule publication.
- if ( 'future' == $post_status )
- wp_schedule_single_event(strtotime($post_date_gmt. ' GMT'), 'publish_future_post', array($post_ID));
+ if ( $update)
+ do_action('edit_post', $post_ID, $post);
- do_action('save_post', $post_ID);
- do_action('wp_insert_post', $post_ID);
+ do_action('save_post', $post_ID, $post);
+ do_action('wp_insert_post', $post_ID, $post);
return $post_ID;
}
@@ -731,7 +792,7 @@ function wp_update_post($postarr = array()) {
$post_cats = $post['post_category'];
// Drafts shouldn't be assigned a date unless explicitly done so by the user
- if ( 'draft' == $post['post_status'] && empty($postarr['edit_date']) && empty($postarr['post_date']) &&
+ if ( in_array($post['post_status'], array('draft', 'pending')) && empty($postarr['edit_date']) && empty($postarr['post_date']) &&
('0000-00-00 00:00:00' == $post['post_date']) )
$clear_date = true;
else
@@ -752,6 +813,8 @@ function wp_update_post($postarr = array()) {
}
function wp_publish_post($post_id) {
+ global $wpdb;
+
$post = get_post($post_id);
if ( empty($post) )
@@ -760,7 +823,34 @@ function wp_publish_post($post_id) {
if ( 'publish' == $post->post_status )
return;
- return wp_update_post(array('post_status' => 'publish', 'ID' => $post_id, 'no_filter' => true));
+ $wpdb->query( "UPDATE $wpdb->posts SET post_status = 'publish' WHERE ID = '$post_id'" );
+
+ $old_status = $post->post_status;
+ $post->post_status = 'publish';
+ wp_transition_post_status('publish', $old_status, $post);
+
+ do_action('edit_post', $post_id, $post);
+ do_action('save_post', $post_id, $post);
+ do_action('wp_insert_post', $post_id, $post);
+}
+
+function wp_add_post_tags($post_id = 0, $tags = '') {
+ return wp_set_post_tags($post_id, $tags, true);
+}
+
+function wp_set_post_tags( $post_id = 0, $tags = '', $append = false ) {
+ /* $append - true = don't delete existing tags, just add on, false = replace the tags with the new tags */
+ global $wpdb;
+
+ $post_id = (int) $post_id;
+
+ if ( !$post_id )
+ return false;
+
+ if ( empty($tags) )
+ $tags = array();
+ $tags = (is_array($tags)) ? $tags : explode( ',', $tags );
+ wp_set_object_terms($post_id, $tags, 'post_tag', $append);
}
function wp_set_post_categories($post_ID = 0, $post_categories = array()) {
@@ -770,56 +860,22 @@ function wp_set_post_categories($post_ID = 0, $post_categories = array()) {
// If $post_categories isn't already an array, make it one:
if (!is_array($post_categories) || 0 == count($post_categories) || empty($post_categories))
$post_categories = array(get_option('default_category'));
+ else if ( 1 == count($post_categories) && '' == $post_categories[0] )
+ return true;
+ $post_categories = array_map('intval', $post_categories);
$post_categories = array_unique($post_categories);
- // First the old categories
- $old_categories = $wpdb->get_col("
- SELECT category_id
- FROM $wpdb->post2cat
- WHERE post_id = '$post_ID'");
-
- if (!$old_categories) {
- $old_categories = array();
- } else {
- $old_categories = array_unique($old_categories);
- }
-
- // Delete any?
- $delete_cats = array_diff($old_categories,$post_categories);
-
- if ($delete_cats) {
- foreach ($delete_cats as $del) {
- $wpdb->query("
- DELETE FROM $wpdb->post2cat
- WHERE category_id = '$del'
- AND post_id = '$post_ID'
- ");
- }
- }
-
- // Add any?
- $add_cats = array_diff($post_categories, $old_categories);
-
- if ($add_cats) {
- foreach ($add_cats as $new_cat) {
- $new_cat = (int) $new_cat;
- if ( !empty($new_cat) )
- $wpdb->query("
- INSERT INTO $wpdb->post2cat (post_id, category_id)
- VALUES ('$post_ID', '$new_cat')");
- }
- }
+ return wp_set_object_terms($post_ID, $post_categories, 'category');
+} // wp_set_post_categories()
- // Update category counts.
- $all_affected_cats = array_unique(array_merge($post_categories, $old_categories));
- foreach ( $all_affected_cats as $cat_id ) {
- $count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->post2cat, $wpdb->posts WHERE $wpdb->posts.ID=$wpdb->post2cat.post_id AND post_status = 'publish' AND post_type = 'post' AND category_id = '$cat_id'");
- $wpdb->query("UPDATE $wpdb->categories SET category_count = '$count' WHERE cat_ID = '$cat_id'");
- clean_category_cache($cat_id);
- do_action('edit_category', $cat_id);
+function wp_transition_post_status($new_status, $old_status, $post) {
+ if ( $new_status != $old_status ) {
+ do_action('transition_post_status', $new_status, $old_status, $post);
+ do_action("${old_status}_to_$new_status", $post);
}
-} // wp_set_post_categories()
+ do_action("${new_status}_$post->post_type", $post->ID, $post);
+}
//
// Trackback and ping functions
@@ -920,7 +976,7 @@ function &get_page(&$page, $output = OBJECT) {
global $wpdb, $blog_id;
if ( empty($page) ) {
- if ( isset($GLOBALS['page']) ) {
+ if ( isset( $GLOBALS['page'] ) && isset( $GLOBALS['page']->ID ) ) {
$_page = & $GLOBALS['page'];
wp_cache_add($_page->ID, $_page, 'pages');
} else {
@@ -1059,15 +1115,16 @@ function get_page_uri($page_id) {
function &get_pages($args = '') {
global $wpdb;
- if ( is_array($args) )
- $r = &$args;
- else
- parse_str($args, $r);
+ $defaults = array(
+ 'child_of' => 0, 'sort_order' => 'ASC',
+ 'sort_column' => 'post_title', 'hierarchical' => 1,
+ 'exclude' => '', 'include' => '',
+ 'meta_key' => '', 'meta_value' => '',
+ 'authors' => ''
+ );
- $defaults = array('child_of' => 0, 'sort_order' => 'ASC', 'sort_column' => 'post_title',
- 'hierarchical' => 1, 'exclude' => '', 'include' => '', 'meta_key' => '', 'meta_value' => '', 'authors' => '');
- $r = array_merge($defaults, $r);
- extract($r, EXTR_SKIP);
+ $r = wp_parse_args( $args, $defaults );
+ extract( $r, EXTR_SKIP );
$key = md5( serialize( $r ) );
if ( $cache = wp_cache_get( 'get_pages', 'page' ) )
@@ -1076,7 +1133,7 @@ function &get_pages($args = '') {
$inclusions = '';
if ( !empty($include) ) {
- $child_of = 0; //ignore child_of, exclude, meta_key, and meta_value params if using include
+ $child_of = 0; //ignore child_of, exclude, meta_key, and meta_value params if using include
$exclude = '';
$meta_key = '';
$meta_value = '';
@@ -1105,7 +1162,7 @@ function &get_pages($args = '') {
}
}
}
- if (!empty($exclusions))
+ if (!empty($exclusions))
$exclusions .= ')';
$author_query = '';
@@ -1135,14 +1192,13 @@ function &get_pages($args = '') {
}
$query = "SELECT * FROM $wpdb->posts " ;
- $query .= ( empty( $meta_key ) ? "" : ", $wpdb->postmeta " ) ;
+ $query .= ( empty( $meta_key ) ? "" : ", $wpdb->postmeta " ) ;
$query .= " WHERE (post_type = 'page' AND post_status = 'publish') $exclusions $inclusions " ;
$query .= ( empty( $meta_key ) | empty($meta_value) ? "" : " AND ($wpdb->posts.ID = $wpdb->postmeta.post_id AND $wpdb->postmeta.meta_key = '$meta_key' AND $wpdb->postmeta.meta_value = '$meta_value' )" ) ;
$query .= $author_query;
$query .= " ORDER BY " . $sort_column . " " . $sort_order ;
$pages = $wpdb->get_results($query);
- $pages = apply_filters('get_pages', $pages, $r);
if ( empty($pages) )
return array();
@@ -1156,6 +1212,8 @@ function &get_pages($args = '') {
$cache[ $key ] = $pages;
wp_cache_set( 'get_pages', $cache, 'page' );
+ $pages = apply_filters('get_pages', $pages, $r);
+
return $pages;
}
@@ -1214,31 +1272,26 @@ function is_local_attachment($url) {
return false;
}
-function wp_insert_attachment($object, $file = false, $post_parent = 0) {
+function wp_insert_attachment($object, $file = false, $parent = 0) {
global $wpdb, $user_ID;
- if ( is_object($object) )
- $object = get_object_vars($object);
+ $defaults = array('post_status' => 'draft', 'post_type' => 'post', 'post_author' => $user_ID,
+ 'ping_status' => get_option('default_ping_status'), 'post_parent' => 0,
+ 'menu_order' => 0, 'to_ping' => '', 'pinged' => '', 'post_password' => '');
- // Export array as variables
- extract($object, EXTR_SKIP);
+ $object = wp_parse_args($object, $defaults);
+ if ( !empty($parent) )
+ $object['post_parent'] = $parent;
- // Get the basics.
- $post_content = apply_filters('content_save_pre', $post_content);
- $post_content_filtered = apply_filters('content_filtered_save_pre', $post_content_filtered);
- $post_excerpt = apply_filters('excerpt_save_pre', $post_excerpt);
- $post_title = apply_filters('title_save_pre', $post_title);
- $post_category = apply_filters('category_save_pre', $post_category);
- $post_name = apply_filters('name_save_pre', $post_name);
- $comment_status = apply_filters('comment_status_pre', $comment_status);
- $ping_status = apply_filters('ping_status_pre', $ping_status);
- $post_mime_type = apply_filters('post_mime_type_pre', $post_mime_type);
+ $object = sanitize_post($object, 'db');
+
+ // export array as variables
+ extract($object, EXTR_SKIP);
// Make sure we set a valid category
if (0 == count($post_category) || !is_array($post_category)) {
$post_category = array(get_option('default_category'));
}
- $post_cat = $post_category[0];
if ( empty($post_author) )
$post_author = $user_ID;
@@ -1272,9 +1325,9 @@ function wp_insert_attachment($object, $file = false, $post_parent = 0) {
$post_name = $alt_post_name;
}
- if (empty($post_date))
+ if ( empty($post_date) )
$post_date = current_time('mysql');
- if (empty($post_date_gmt))
+ if ( empty($post_date_gmt) )
$post_date_gmt = current_time('mysql', 1);
if ( empty($comment_status) ) {
@@ -1285,8 +1338,6 @@ function wp_insert_attachment($object, $file = false, $post_parent = 0) {
}
if ( empty($ping_status) )
$ping_status = get_option('default_ping_status');
- if ( empty($post_pingback) )
- $post_pingback = get_option('default_pingback_flag');
if ( isset($to_ping) )
$to_ping = preg_replace('|\s+|', "\n", $to_ping);
@@ -1306,11 +1357,6 @@ function wp_insert_attachment($object, $file = false, $post_parent = 0) {
if ( !isset($post_password) )
$post_password = '';
- if ( isset($to_ping) )
- $to_ping = preg_replace('|\s+|', "\n", $to_ping);
- else
- $to_ping = '';
-
if ( ! isset($pinged) )
$pinged = '';
@@ -1382,12 +1428,13 @@ function wp_delete_attachment($postid) {
$meta = wp_get_attachment_metadata( $postid );
$file = get_attached_file( $postid );
+ // TODO delete for pluggable post taxonomies too
+ wp_delete_object_term_relationships($postid, array('category', 'post_tag'));
+
$wpdb->query("DELETE FROM $wpdb->posts WHERE ID = '$postid'");
$wpdb->query("DELETE FROM $wpdb->comments WHERE comment_post_ID = '$postid'");
- $wpdb->query("DELETE FROM $wpdb->post2cat WHERE post_id = '$postid'");
-
$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id = '$postid'");
if ( ! empty($meta['thumb']) ) {
@@ -1566,7 +1613,7 @@ function wp_check_for_changed_slugs($post_id) {
* SQL code that can be added to a WHERE clause; this SQL is constructed
* to allow all published posts, and all private posts to which the user
* has access.
- *
+ *
* @param string $post_type currently only supports 'post' or 'page'.
* @return string SQL code that can be added to a where clause.
*/
@@ -1606,4 +1653,237 @@ function get_private_posts_cap_sql($post_type) {
return $sql;
}
+function get_lastpostdate($timezone = 'server') {
+ global $cache_lastpostdate, $pagenow, $wpdb, $blog_id;
+ $add_seconds_blog = get_option('gmt_offset') * 3600;
+ $add_seconds_server = date('Z');
+ if ( !isset($cache_lastpostdate[$blog_id][$timezone]) ) {
+ switch(strtolower($timezone)) {
+ case 'gmt':
+ $lastpostdate = $wpdb->get_var("SELECT post_date_gmt FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1");
+ break;
+ case 'blog':
+ $lastpostdate = $wpdb->get_var("SELECT post_date FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1");
+ break;
+ case 'server':
+ $lastpostdate = $wpdb->get_var("SELECT DATE_ADD(post_date_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1");
+ break;
+ }
+ $cache_lastpostdate[$blog_id][$timezone] = $lastpostdate;
+ } else {
+ $lastpostdate = $cache_lastpostdate[$blog_id][$timezone];
+ }
+ return apply_filters( 'get_lastpostdate', $lastpostdate );
+}
+
+function get_lastpostmodified($timezone = 'server') {
+ global $cache_lastpostmodified, $pagenow, $wpdb, $blog_id;
+ $add_seconds_blog = get_option('gmt_offset') * 3600;
+ $add_seconds_server = date('Z');
+ if ( !isset($cache_lastpostmodified[$blog_id][$timezone]) ) {
+ switch(strtolower($timezone)) {
+ case 'gmt':
+ $lastpostmodified = $wpdb->get_var("SELECT post_modified_gmt FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_modified_gmt DESC LIMIT 1");
+ break;
+ case 'blog':
+ $lastpostmodified = $wpdb->get_var("SELECT post_modified FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_modified_gmt DESC LIMIT 1");
+ break;
+ case 'server':
+ $lastpostmodified = $wpdb->get_var("SELECT DATE_ADD(post_modified_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_modified_gmt DESC LIMIT 1");
+ break;
+ }
+ $lastpostdate = get_lastpostdate($timezone);
+ if ( $lastpostdate > $lastpostmodified ) {
+ $lastpostmodified = $lastpostdate;
+ }
+ $cache_lastpostmodified[$blog_id][$timezone] = $lastpostmodified;
+ } else {
+ $lastpostmodified = $cache_lastpostmodified[$blog_id][$timezone];
+ }
+ return apply_filters( 'get_lastpostmodified', $lastpostmodified );
+}
+
+//
+// Cache
+//
+
+function update_post_cache(&$posts) {
+ global $post_cache, $blog_id;
+
+ if ( !$posts )
+ return;
+
+ for ($i = 0; $i < count($posts); $i++) {
+ $post_cache[$blog_id][$posts[$i]->ID] = &$posts[$i];
+ }
+}
+
+function clean_post_cache($id) {
+ global $post_cache, $post_meta_cache, $post_term_cache, $blog_id;
+
+ if ( isset( $post_cache[$blog_id][$id] ) )
+ unset( $post_cache[$blog_id][$id] );
+
+ if ( isset ($post_meta_cache[$blog_id][$id] ) )
+ unset( $post_meta_cache[$blog_id][$id] );
+
+ clean_object_term_cache($id, 'post');
+}
+
+function update_page_cache(&$pages) {
+ global $page_cache, $blog_id;
+
+ if ( !$pages )
+ return;
+
+ for ($i = 0; $i < count($pages); $i++) {
+ $page_cache[$blog_id][$pages[$i]->ID] = &$pages[$i];
+ wp_cache_add($pages[$i]->ID, $pages[$i], 'pages');
+ }
+}
+
+function clean_page_cache($id) {
+ global $page_cache, $blog_id;
+
+ if ( isset( $page_cache[$blog_id][$id] ) )
+ unset( $page_cache[$blog_id][$id] );
+
+ wp_cache_delete($id, 'pages');
+ wp_cache_delete( 'all_page_ids', 'pages' );
+ wp_cache_delete( 'get_pages', 'page' );
+}
+
+function update_post_caches(&$posts) {
+ global $post_cache;
+ global $wpdb, $blog_id;
+
+ // No point in doing all this work if we didn't match any posts.
+ if ( !$posts )
+ return;
+
+ // Get the categories for all the posts
+ for ($i = 0; $i < count($posts); $i++) {
+ $post_id_array[] = $posts[$i]->ID;
+ $post_cache[$blog_id][$posts[$i]->ID] = &$posts[$i];
+ }
+
+ $post_id_list = implode(',', $post_id_array);
+
+ update_object_term_cache($post_id_list, 'post');
+
+ update_postmeta_cache($post_id_list);
+}
+
+function update_postmeta_cache($post_id_list = '') {
+ global $wpdb, $post_meta_cache, $blog_id;
+
+ // We should validate this comma-separated list for the upcoming SQL query
+ $post_id_list = preg_replace('|[^0-9,]|', '', $post_id_list);
+
+ if ( empty( $post_id_list ) )
+ return false;
+
+ // we're marking each post as having its meta cached (with no keys... empty array), to prevent posts with no meta keys from being queried again
+ // any posts that DO have keys will have this empty array overwritten with a proper array, down below
+ $post_id_array = (array) explode(',', $post_id_list);
+ $count = count( $post_id_array);
+ for ( $i = 0; $i < $count; $i++ ) {
+ $post_id = (int) $post_id_array[ $i ];
+ if ( isset( $post_meta_cache[$blog_id][$post_id] ) ) { // If the meta is already cached
+ unset( $post_id_array[ $i ] );
+ continue;
+ }
+ $post_meta_cache[$blog_id][$post_id] = array();
+ }
+ if ( count( $post_id_array ) == 0 )
+ return;
+ $post_id_list = join( ',', $post_id_array ); // with already cached stuff removeds
+
+ // Get post-meta info
+ if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE post_id IN($post_id_list) ORDER BY post_id, meta_key", ARRAY_A) ) {
+ // Change from flat structure to hierarchical:
+ if ( !isset($post_meta_cache) )
+ $post_meta_cache[$blog_id] = array();
+
+ foreach ($meta_list as $metarow) {
+ $mpid = (int) $metarow['post_id'];
+ $mkey = $metarow['meta_key'];
+ $mval = $metarow['meta_value'];
+
+ // Force subkeys to be array type:
+ if ( !isset($post_meta_cache[$blog_id][$mpid]) || !is_array($post_meta_cache[$blog_id][$mpid]) )
+ $post_meta_cache[$blog_id][$mpid] = array();
+ if ( !isset($post_meta_cache[$blog_id][$mpid]["$mkey"]) || !is_array($post_meta_cache[$blog_id][$mpid]["$mkey"]) )
+ $post_meta_cache[$blog_id][$mpid]["$mkey"] = array();
+
+ // Add a value to the current pid/key:
+ $post_meta_cache[$blog_id][$mpid][$mkey][] = $mval;
+ }
+ }
+}
+
+//
+// Hooks
+//
+
+function _transition_post_status($new_status, $old_status, $post) {
+ global $wpdb;
+
+ if ( $old_status != 'publish' && $new_status == 'publish' ) {
+ // Reset GUID if transitioning to publish.
+ $wpdb->query("UPDATE $wpdb->posts SET guid = '" . get_permalink($post->ID) . "' WHERE ID = '$post->ID'");
+ do_action('private_to_published', $post->ID); // Deprecated, use private_to_publish
+ }
+
+ // Always clears the hook in case the post status bounced from future to draft.
+ wp_clear_scheduled_hook('publish_future_post', $post->ID);
+}
+
+function _future_post_hook($post_id, $post) {
+ // Schedule publication.
+ wp_clear_scheduled_hook( 'publish_future_post', $post->ID );
+ wp_schedule_single_event(strtotime($post->post_date_gmt. ' GMT'), 'publish_future_post', array($post->ID));
+}
+
+function _publish_post_hook($post_id) {
+ global $wpdb;
+
+ if ( defined('XMLRPC_REQUEST') )
+ do_action('xmlrpc_publish_post', $post_id);
+ if ( defined('APP_REQUEST') )
+ do_action('app_publish_post', $post_id);
+
+ if ( defined('WP_IMPORTING') )
+ return;
+
+ $post = get_post($post_id);
+
+ if ( get_option('default_pingback_flag') )
+ $result = $wpdb->query("
+ INSERT INTO $wpdb->postmeta
+ (post_id,meta_key,meta_value)
+ VALUES ('$post_id','_pingme','1')
+ ");
+ $result = $wpdb->query("
+ INSERT INTO $wpdb->postmeta
+ (post_id,meta_key,meta_value)
+ VALUES ('$post_id','_encloseme','1')
+ ");
+ wp_schedule_single_event(time(), 'do_pings');
+}
+
+function _save_post_hook($post_id, $post) {
+ if ( $post->post_type == 'page' ) {
+ if ( !empty($post->page_template) )
+ if ( ! update_post_meta($post_id, '_wp_page_template', $post->page_template))
+ add_post_meta($post_id, '_wp_page_template', $post->page_template, true);
+
+ clean_page_cache($post_id);
+ global $wp_rewrite;
+ $wp_rewrite->flush_rules();
+ } else {
+ clean_post_cache($post_id);
+ }
+}
+
?>