posts; $comments = $wpdb->comments; $links = $wpdb->links; $term_taxonomy = $wpdb->term_taxonomy; // WP 3.0: SELECT * FROM wp_comments c LEFT JOIN wp_posts p ON c.comment_post_ID = p.ID WHERE p.post_status != 'trash' AND ( c.comment_approved = '0' OR c.comment_approved = '1' ) ORDER BY c.comment_date_gmt // if ( strpos($query, "ELECT ") && preg_match ("/FROM\s*{$GLOBALS['wpdb']->comments}/", $query) && ( ! strpos($query, "ELECT COUNT") || empty( $_POST ) ) && ( ! strpos($_SERVER['SCRIPT_FILENAME'], 'p-admin/upload.php') ) ) // don't filter the comment count query prior to DB storage of comment_count to post record { //define( 'SCOPER_NO_COMMENT_FILTERING', true ); if ( defined( 'SCOPER_NO_COMMENT_FILTERING' ) && empty( $GLOBALS['current_user']->allcaps['moderate_comments'] ) ) { return $query; } // cache the filtered results for pending comment count query, which (as of WP 3.0.1) is executed once per-post in the edit listing $post_id = 0; if ( $doing_pending_comment_count = strpos( $query, 'COUNT(comment_ID)' ) && strpos( $query, 'comment_post_ID' ) && strpos( $query, "comment_approved = '0'" ) ) { if ( 'index.php' != $pagenow ) { // there's too much happening on the dashboard (and too much low-level query filtering) to buffer listed IDs reliably. if ( preg_match( "/comment_post_ID IN \( '([0-9]+)' \)/", $query, $matches ) ) { if ( $matches[1] ) $post_id = $matches[1]; } } if ( $post_id ) { static $cache_pending_comment_count; if ( ! isset($cache_pending_comment_count) ) { $cache_pending_comment_count = array(); } elseif ( isset( $cache_pending_comment_count[$post_id] ) ) { return "SELECT $post_id AS comment_post_ID, {$cache_pending_comment_count[$post_id]} AS num_comments"; } } } $comment_alias = ( strpos( $query, "$comments c" ) || strpos( $query, "$comments AS c" ) ) ? 'c' : $comments; // apply DISTINCT clause so JOINs don't cause redundant comment count $query = str_replace( "SELECT *", "SELECT DISTINCT $comment_alias.*", $query); $query = str_replace( "SELECT SQL_CALC_FOUND_ROWS *", "SELECT SQL_CALC_FOUND_ROWS DISTINCT $comment_alias.*", $query); if ( ! strpos( $query, ' DISTINCT ' ) ) $query = str_replace( "SELECT ", "SELECT DISTINCT ", $query); //$query = str_replace( "COUNT(*)", " COUNT(DISTINCT $comments.comment_ID)", $query); // TODO: confirm preg_replace works and str_replace is not needed //$query = str_replace( "COUNT(comment_ID)", " COUNT(DISTINCT $comments.comment_ID)", $query); $query = preg_replace( "/COUNT(\s*\*\s*)/", " COUNT(DISTINCT $comments.comment_ID)", $query); $query = preg_replace( "/COUNT(\s*comment_ID\s*)/", " COUNT(DISTINCT $comments.comment_ID)", $query); $query = str_replace( " user_id ", " $comment_alias.user_id ", $query); if ( ! strpos( $query, "JOIN $posts" ) ) { if ( strpos( $query, "$comments c" ) ) $query = preg_replace( "/FROM\s*{$comments} c\s*WHERE /", "FROM $comments c INNER JOIN $posts ON $posts.ID = $comment_alias.comment_post_ID WHERE ", $query); else $query = preg_replace( "/FROM\s*{$comments}\s*WHERE /", "FROM $comments INNER JOIN $posts ON $posts.ID = $comment_alias.comment_post_ID WHERE ", $query); if ( strpos( $query, "GROUP BY" ) ) $query = preg_replace( "/FROM\s*{$comments}\s*GROUP BY /", "FROM $comments INNER JOIN $posts ON $posts.ID = $comment_alias.comment_post_ID GROUP BY ", $query); } $generic_uri = in_array( $pagenow, array( 'index.php', 'comments.php' ) ); if ( ! $generic_uri && ( $_post_type = cr_find_post_type( '', false ) ) ) // arg: don't return 'post' as default if detection fails $post_types = array( $_post_type => get_post_type_object( $_post_type ) ); else $post_types = array_diff_key( get_post_types( array( 'public' => true ), 'object' ), array( 'attachment' => true ) ); $post_statuses = get_post_stati( array( 'internal' => null ), 'object' ); $reqd_caps = array(); $use_post_types = scoper_get_option( 'use_post_types' ); foreach( $post_types as $_post_type => $type_obj ) { if ( empty( $use_post_types[$_post_type] ) ) continue; foreach ( $post_statuses as $status => $status_obj ) { $reqd_caps[$_post_type][$status] = array( $type_obj->cap->edit_others_posts, 'moderate_comments' ); if ( $status_obj->private ) $reqd_caps[$_post_type][$status] []= $type_obj->cap->edit_private_posts; $status_name = ( ( 'publish' == $status ) || ( 'future' == $status ) ) ? 'published' : $status; $property = "edit_{$status_name}_posts"; if ( ! empty( $type_obj->cap->$property ) && ! in_array( $type_obj->cap->$property, $reqd_caps[$_post_type][$status] ) ) $reqd_caps[$_post_type][$status] []= $type_obj->cap->$property; } } $args = array( 'force_reqd_caps' => $reqd_caps ); if ( strpos( $query, "$posts p" ) || strpos( $query, "$posts AS p" ) ) $args['source_alias'] = 'p'; $object_type = ( 'edit.php' == $pagenow ) ? cr_find_post_type() : ''; $query = apply_filters( 'objects_request_rs', $query, 'post', $object_type, $args ); // pre-execute the comments listing query and buffer the listed IDs for more efficient user_has_cap calls if ( strpos( $query, "* FROM $comments") && empty($scoper->listed_ids['post']) ) { if ( $results = scoper_get_results($query) ) { $scoper->listed_ids['post'] = array(); foreach ( $results as $row ) { if ( ! empty($row->comment_post_ID) ) $scoper->listed_ids['post'][$row->comment_post_ID] = true; } } } elseif ( $doing_pending_comment_count && $post_id ) { if ( isset($scoper->listed_ids['post']) ) $listed_ids = array_keys($scoper->listed_ids['post']); elseif ( ! empty($GLOBALS['wp_object_cache']->cache['posts']) && is_array($GLOBALS['wp_object_cache']->cache['posts']) ) $listed_ids = array_keys($GLOBALS['wp_object_cache']->cache['posts']); else $listed_ids = array(); // make sure our current post_id is in the list $listed_ids[] = $post_id; if ( count( $listed_ids ) > 1 ) { // cache the pending comment count for all listed posts $query = str_replace( "comment_post_ID IN ( '$post_id' )", "comment_post_ID IN ( '" . implode( "','", $listed_ids ) . "' )", $query ); $results = scoper_get_results( $query ); $cache_pending_comment_count = array_fill_keys( $listed_ids, 0 ); foreach( $results as $row ) $cache_pending_comment_count[ $row->comment_post_ID ] = $row->comment_count; } } //d_echo( "
replaced: $query
" ); //rs_errlog ("

replaced with $query

"); } // endif matched query substring // num cats: "SELECT COUNT(*) FROM wp_term_taxonomy" // SELECT DISTINCT COUNT(tt.term_id) FROM wp_term_taxonomy AS tt WHERE 1=1 AND tt.taxonomy = 'category' // SELECT DISTINCT tt.term_id FROM wp_term_taxonomy AS tt WHERE if ( ! in_array( $pagenow, array( 'post.php', 'post-new.php') ) && ! defined('XMLRPC_REQUEST') ) { if ( strpos($query, " FROM $term_taxonomy") || strpos($query, " FROM $wpdb->terms") ) { //rs_errlog ("
caught $query
"); // don't mess with parent category selection/availability for single term edit $is_term_admin = ( in_array( $pagenow, array( 'edit-tags.php', 'edit-link-categories.php' ) ) ); if ( $is_term_admin ) { if ( ! empty( $_REQUEST['tag_ID'] ) ) return $query; } $matches = array(); if ( $return = preg_match( "/taxonomy IN \('(.*)'/", $query, $matches ) ) $taxonomy = explode( "','", str_replace( ' ', '', $matches[1] ) ); elseif ( $return = preg_match( "/taxonomy\s*=\s*'(.*)'/", $query, $matches ) ) $taxonomy = $matches[1]; if ( ! empty($taxonomy) ) { if ( 'profile.php' == $pagenow ) return $query; else $query = apply_filters( 'terms_request_rs', $query, $taxonomy, array( 'is_term_admin' => $is_term_admin ) ); } //rs_errlog ("

returning $query
"); return $query; } } // get_users_drafts() and get_others_unpublished_posts() // // Recent posts: SELECT ID, post_title FROM wp_posts WHERE post_type = 'post' AND (post_status = 'publish' OR post_status = 'private') AND post_date_gmt < '2008-04-30 05:04:04' ORDER BY post_date DESC LIMIT 5 // Scheduled entries: SELECT ID, post_title, post_date_gmt FROM wp_posts WHERE post_type = 'post' AND post_status = 'future' ORDER BY post_date ASC" if ( ( strpos($query, "post_date_gmt <") && strpos ($query, "ELECT ID, post_title") && strpos($query, " FROM $posts WHERE ") ) || ( strpos ($query, "ELECT ID, post_title, post_date_gmt") && strpos($query, " FROM $posts WHERE ") ) ) { if ( $_post_type = cr_find_post_type() ) $query = apply_filters('objects_request_rs', $query, 'post', $_post_type, ''); } // links //SELECT * , IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated FROM wp_links WHERE 1=1 ORDER BY link_name ASC if ( ( strpos($query, "FROM $links WHERE") || strpos($query, "FROM $links WHERE") ) && strpos($query, "ELECT ") ) { $query = apply_filters('objects_request_rs', $query, 'link', 'link'); return $query; } return $query; } // end function // Note: this filter is never invoked by WP core as of WP 2.7 function flt_get_others_drafts($results) { global $wpdb, $current_user, $scoper; // buffer titles in case they were filtered previously $titles = scoper_get_property_array( $results, 'ID', 'post_title' ); // WP 2.3 added pending status, but no new hook or hook argument $draft_query = strpos($wpdb->last_query, 'draft'); $pending_query = strpos($wpdb->last_query, 'pending'); if ( $draft_query && $pending_query ) $status_clause = "AND ( post_status = 'draft' OR post_status = 'pending' )"; elseif ( $draft_query ) $status_clause = "AND post_status = 'draft'"; else $status_clause = "AND post_status = 'pending'"; $object_type = cr_find_post_type(); if ( ! $object_type ) $object_type = 'post'; if ( ! $otype_val = $scoper->data_sources->member_property('post', 'object_types', $object_type, 'val') ) $otype_val = $object_type; $qry = "SELECT ID, post_title, post_author FROM $wpdb->posts WHERE post_type = '$otype_val' AND post_author != '$current_user->ID' $status_clause"; $qry = apply_filters('objects_request_rs', $qry, 'post', '', ''); $items = scoper_get_results($qry); // restore buffered titles in case they were filtered previously scoper_restore_property_array( $items, $titles, 'ID', 'post_title' ); return $items; } } // end class ?>