Make WordPress Core

Changeset 3714


Ignore:
Timestamp:
04/19/2006 02:32:12 AM (18 years ago)
Author:
ryan
Message:

Reorg comment functions. #2525

Location:
trunk
Files:
1 added
2 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/comment.php

    r3713 r3714  
    11<?php
    2 
    3 // Template functions
    4 
    5 function comments_template( $file = '/comments.php' ) {
    6     global $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_ID, $user_identity;
    7 
    8     if ( is_single() || is_page() || $withcomments ) :
    9         $req = get_settings('require_name_email');
    10         $comment_author = '';
    11         if ( isset($_COOKIE['comment_author_'.COOKIEHASH]) ) {
    12             $comment_author = apply_filters('pre_comment_author_name', $_COOKIE['comment_author_'.COOKIEHASH]);
    13             $comment_author = stripslashes($comment_author);
    14             $comment_author = wp_specialchars($comment_author, true);
    15         }
    16         $comment_author_email = '';
    17         if ( isset($_COOKIE['comment_author_email_'.COOKIEHASH]) ) {
    18             $comment_author_email = apply_filters('pre_comment_author_email', $_COOKIE['comment_author_email_'.COOKIEHASH]);
    19             $comment_author_email = stripslashes($comment_author_email);
    20             $comment_author_email = wp_specialchars($comment_author_email, true);       
    21         }
    22         $comment_author_url = '';
    23         if ( isset($_COOKIE['comment_author_url_'.COOKIEHASH]) ) {
    24             $comment_author_url = apply_filters('pre_comment_author_url', $_COOKIE['comment_author_url_'.COOKIEHASH]);
    25             $comment_author_url = stripslashes($comment_author_url);
    26             $comment_author_url = wp_specialchars($comment_author_url, true);       
    27         }
    28 
    29     if ( empty($comment_author) ) {
    30         $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post->ID' AND comment_approved = '1' ORDER BY comment_date");
    31     } else {
    32         $author_db = $wpdb->escape($comment_author);
    33         $email_db  = $wpdb->escape($comment_author_email);
    34         $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post->ID' AND ( comment_approved = '1' OR ( comment_author = '$author_db' AND comment_author_email = '$email_db' AND comment_approved = '0' ) ) ORDER BY comment_date");
    35     }
    36 
    37     define('COMMENTS_TEMPLATE', true);
    38     $include = apply_filters('comments_template', TEMPLATEPATH . $file );
    39     if ( file_exists( $include ) )
    40         require( $include );
    41     else
    42         require( ABSPATH . 'wp-content/themes/default/comments.php');
    43 
    44     endif;
    45 }
    46 
    47 function wp_new_comment( $commentdata ) {
    48     $commentdata = apply_filters('preprocess_comment', $commentdata);
    49 
    50     $commentdata['comment_post_ID'] = (int) $commentdata['comment_post_ID'];
    51     $commentdata['user_ID']         = (int) $commentdata['user_ID'];
    52 
    53     $commentdata['comment_author_IP'] = $_SERVER['REMOTE_ADDR'];
    54     $commentdata['comment_agent']     = $_SERVER['HTTP_USER_AGENT'];
    55 
    56     $commentdata['comment_date']     = current_time('mysql');
    57     $commentdata['comment_date_gmt'] = current_time('mysql', 1);
    58 
    59 
    60     $commentdata = wp_filter_comment($commentdata);
    61 
    62     $commentdata['comment_approved'] = wp_allow_comment($commentdata);
    63 
    64     $comment_ID = wp_insert_comment($commentdata);
    65 
    66     do_action('comment_post', $comment_ID, $commentdata['comment_approved']);
    67 
    68     if ( 'spam' !== $commentdata['comment_approved'] ) { // If it's spam save it silently for later crunching
    69         if ( '0' == $commentdata['comment_approved'] )
    70             wp_notify_moderator($comment_ID);
    71 
    72         $post = &get_post($commentdata['comment_post_ID']); // Don't notify if it's your own comment
    73 
    74         if ( get_settings('comments_notify') && $commentdata['comment_approved'] && $post->post_author != $commentdata['user_ID'] )
    75             wp_notify_postauthor($comment_ID, $commentdata['comment_type']);
    76     }
    77 
    78     return $comment_ID;
    79 }
    80 
    81 function wp_insert_comment($commentdata) {
    82     global $wpdb;
    83     extract($commentdata);
    84 
    85     if ( ! isset($comment_author_IP) )
    86         $comment_author_IP = $_SERVER['REMOTE_ADDR'];
    87     if ( ! isset($comment_date) )
    88         $comment_date = current_time('mysql');
    89     if ( ! isset($comment_date_gmt) )
    90         $comment_date_gmt = gmdate('Y-m-d H:i:s', strtotime($comment_date) );
    91     if ( ! isset($comment_parent) )
    92         $comment_parent = 0;
    93     if ( ! isset($comment_approved) )
    94         $comment_approved = 1;
    95     if ( ! isset($user_id) )
    96         $user_id = 0;
    97 
    98     $result = $wpdb->query("INSERT INTO $wpdb->comments
    99     (comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_date_gmt, comment_content, comment_approved, comment_agent, comment_type, comment_parent, user_id)
    100     VALUES
    101     ('$comment_post_ID', '$comment_author', '$comment_author_email', '$comment_author_url', '$comment_author_IP', '$comment_date', '$comment_date_gmt', '$comment_content', '$comment_approved', '$comment_agent', '$comment_type', '$comment_parent', '$user_id')
    102     ");
    103 
    104     $id = $wpdb->insert_id;
    105 
    106     if ( $comment_approved == 1) {
    107         $count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND comment_approved = '1'");
    108         $wpdb->query( "UPDATE $wpdb->posts SET comment_count = $count WHERE ID = '$comment_post_ID'" );
    109     }
    110     return $id;
    111 }
    112 
    113 function wp_filter_comment($commentdata) {
    114     $commentdata['user_id']              = apply_filters('pre_user_id', $commentdata['user_ID']);
    115     $commentdata['comment_agent']        = apply_filters('pre_comment_user_agent', $commentdata['comment_agent']);
    116     $commentdata['comment_author']       = apply_filters('pre_comment_author_name', $commentdata['comment_author']);
    117     $commentdata['comment_content']      = apply_filters('pre_comment_content', $commentdata['comment_content']);
    118     $commentdata['comment_author_IP']    = apply_filters('pre_comment_user_ip', $commentdata['comment_author_IP']);
    119     $commentdata['comment_author_url']   = apply_filters('pre_comment_author_url', $commentdata['comment_author_url']);
    120     $commentdata['comment_author_email'] = apply_filters('pre_comment_author_email', $commentdata['comment_author_email']);
    121     $commentdata['filtered'] = true;
    122     return $commentdata;
    123 }
    124 
    125 function wp_allow_comment($commentdata) {
    126     global $wpdb;
    127     extract($commentdata);
    128 
    129     $comment_user_domain = apply_filters('pre_comment_user_domain', gethostbyaddr($comment_author_IP) );
    130 
    131     // Simple duplicate check
    132     $dupe = "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND ( comment_author = '$comment_author' ";
    133     if ( $comment_author_email )
    134         $dupe .= "OR comment_author_email = '$comment_author_email' ";
    135     $dupe .= ") AND comment_content = '$comment_content' LIMIT 1";
    136     if ( $wpdb->get_var($dupe) )
    137         die( __('Duplicate comment detected; it looks as though you\'ve already said that!') );
    138 
    139     // Simple flood-protection
    140     if ( $lasttime = $wpdb->get_var("SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_author_IP = '$comment_author_IP' OR comment_author_email = '$comment_author_email' ORDER BY comment_date DESC LIMIT 1") ) {
    141         $time_lastcomment = mysql2date('U', $lasttime);
    142         $time_newcomment  = mysql2date('U', $comment_date_gmt);
    143         if ( ($time_newcomment - $time_lastcomment) < 15 ) {
    144             do_action('comment_flood_trigger', $time_lastcomment, $time_newcomment);
    145             die( __('Sorry, you can only post a new comment once every 15 seconds. Slow down cowboy.') );
    146         }
    147     }
    148 
    149     if ( $user_id ) {
    150         $userdata = get_userdata($user_id);
    151         $user = new WP_User($user_id);
    152         $post_author = $wpdb->get_var("SELECT post_author FROM $wpdb->posts WHERE ID = '$comment_post_ID' LIMIT 1");
    153     }
    154 
    155     // The author and the admins get respect.
    156     if ( $userdata && ( $user_id == $post_author || $user->has_cap('level_9') ) ) {
    157         $approved = 1;
    158     }
    159 
    160     // Everyone else's comments will be checked.
    161     else {
    162         if ( check_comment($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent, $comment_type) )
    163             $approved = 1;
    164         else
    165             $approved = 0;
    166         if ( wp_blacklist_check($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent) )
    167             $approved = 'spam';
    168     }
    169 
    170     $approved = apply_filters('pre_comment_approved', $approved);
    171     return $approved;
    172 }
    173 
    174 
    175 function wp_update_comment($commentarr) {
    176     global $wpdb;
    177 
    178     // First, get all of the original fields
    179     $comment = get_comment($commentarr['comment_ID'], ARRAY_A);
    180 
    181     // Escape data pulled from DB.
    182     foreach ($comment as $key => $value)
    183         $comment[$key] = $wpdb->escape($value);
    184 
    185     // Merge old and new fields with new fields overwriting old ones.
    186     $commentarr = array_merge($comment, $commentarr);
    187 
    188     $commentarr = wp_filter_comment( $commentarr );
    189 
    190     // Now extract the merged array.
    191     extract($commentarr);
    192 
    193     $comment_content = apply_filters('comment_save_pre', $comment_content);
    194 
    195     $result = $wpdb->query(
    196         "UPDATE $wpdb->comments SET
    197             comment_content = '$comment_content',
    198             comment_author = '$comment_author',
    199             comment_author_email = '$comment_author_email',
    200             comment_approved = '$comment_approved',
    201             comment_author_url = '$comment_author_url',
    202             comment_date = '$comment_date'
    203         WHERE comment_ID = $comment_ID" );
    204 
    205     $rval = $wpdb->rows_affected;
    206 
    207     $c = $wpdb->get_row( "SELECT count(*) as c FROM {$wpdb->comments} WHERE comment_post_ID = '$comment_post_ID' AND comment_approved = '1'" );
    208     if( is_object( $c ) )
    209         $wpdb->query( "UPDATE $wpdb->posts SET comment_count = '$c->c' WHERE ID = '$comment_post_ID'" );
    210 
    211     do_action('edit_comment', $comment_ID);
    212 
    213     return $rval;
    214 }
    215 
    216 function wp_delete_comment($comment_id) {
    217     global $wpdb;
    218     do_action('delete_comment', $comment_id);
    219 
    220     $comment = get_comment($comment_id);
    221 
    222     if ( ! $wpdb->query("DELETE FROM $wpdb->comments WHERE comment_ID='$comment_id' LIMIT 1") )
    223         return false;
    224 
    225     $post_id = $comment->comment_post_ID;
    226     if ( $post_id && $comment->comment_approved == 1 )
    227         $wpdb->query( "UPDATE $wpdb->posts SET comment_count = comment_count - 1 WHERE ID = '$post_id'" );
    228 
    229     do_action('wp_set_comment_status', $comment_id, 'delete');
    230     return true;
    231 }
    232 
    233 function get_comments_number( $post_id = 0 ) {
    234     global $wpdb, $comment_count_cache, $id;
    235     $post_id = (int) $post_id;
    236 
    237     if ( !$post_id )
    238         $post_id = $id;
    239 
    240     if ( !isset($comment_count_cache[$post_id]) )
    241         $comment_count_cache[$id] = $wpdb->get_var("SELECT comment_count FROM $wpdb->posts WHERE ID = '$post_id'");
    242 
    243     return apply_filters('get_comments_number', $comment_count_cache[$post_id]);
    244 }
    245 
    246 function comments_number( $zero = 'No Comments', $one = '1 Comment', $more = '% Comments', $number = '' ) {
    247     global $id, $comment;
    248     $number = get_comments_number( $id );
    249     if ($number == 0) {
    250         $blah = $zero;
    251     } elseif ($number == 1) {
    252         $blah = $one;
    253     } elseif ($number  > 1) {
    254         $blah = str_replace('%', $number, $more);
    255     }
    256     echo apply_filters('comments_number', $blah);
    257 }
    258 
    259 function get_comments_link() {
    260     return get_permalink() . '#comments';
    261 }
    262 
    263 function get_comment_link() {
    264     global $comment;
    265     return get_permalink( $comment->comment_post_ID ) . '#comment-' . $comment->comment_ID;
    266 }
    267 
    268 function comments_link( $file = '', $echo = true ) {
    269     echo get_comments_link();
    270 }
    271 
    272 function comments_popup_script($width=400, $height=400, $file='') {
    273     global $wpcommentspopupfile, $wptrackbackpopupfile, $wppingbackpopupfile, $wpcommentsjavascript;
    274 
    275         if (empty ($file)) {
    276             $wpcommentspopupfile = '';  // Use the index.
    277         } else {
    278             $wpcommentspopupfile = $file;
    279         }
    280 
    281     $wpcommentsjavascript = 1;
    282     $javascript = "<script type='text/javascript'>\nfunction wpopen (macagna) {\n    window.open(macagna, '_blank', 'width=$width,height=$height,scrollbars=yes,status=yes');\n}\n</script>\n";
    283     echo $javascript;
    284 }
    285 
    286 function comments_popup_link($zero='No Comments', $one='1 Comment', $more='% Comments', $CSSclass='', $none='Comments Off') {
    287     global $id, $wpcommentspopupfile, $wpcommentsjavascript, $post, $wpdb;
    288     global $comment_count_cache;
    289 
    290     if (! is_single() && ! is_page()) {
    291     if ( !isset($comment_count_cache[$id]) )
    292         $comment_count_cache[$id] = $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = $id AND comment_approved = '1';");
    293 
    294     $number = $comment_count_cache[$id];
    295 
    296     if (0 == $number && 'closed' == $post->comment_status && 'closed' == $post->ping_status) {
    297         echo $none;
    298         return;
    299     } else {
    300         if (!empty($post->post_password)) { // if there's a password
    301             if ($_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password) {  // and it doesn't match the cookie
    302                 echo(__('Enter your password to view comments'));
    303                 return;
    304             }
    305         }
    306         echo '<a href="';
    307         if ($wpcommentsjavascript) {
    308             if ( empty($wpcommentspopupfile) )
    309                 $home = get_settings('home');
    310             else
    311                 $home = get_settings('siteurl');
    312             echo $home . '/' . $wpcommentspopupfile.'?comments_popup='.$id;
    313             echo '" onclick="wpopen(this.href); return false"';
    314         } else { // if comments_popup_script() is not in the template, display simple comment link
    315             if ( 0 == $number )
    316                 echo get_permalink() . '#respond';
    317             else
    318                 comments_link();
    319             echo '"';
    320         }
    321         if (!empty($CSSclass)) {
    322             echo ' class="'.$CSSclass.'"';
    323         }
    324         echo ' title="' . sprintf( __('Comment on %s'), $post->post_title ) .'">';
    325         comments_number($zero, $one, $more, $number);
    326         echo '</a>';
    327     }
    328     }
    329 }
    330 
    331 function get_comment_ID() {
    332     global $comment;
    333     return apply_filters('get_comment_ID', $comment->comment_ID);
    334 }
    335 
    336 function comment_ID() {
    337     echo get_comment_ID();
    338 }
    339 
    340 function get_comment_author() {
    341     global $comment;
    342     if ( empty($comment->comment_author) )
    343         $author = __('Anonymous');
    344     else
    345         $author = $comment->comment_author;
    346     return apply_filters('get_comment_author', $author);
    347 }
    348 
    349 function comment_author() {
    350     $author = apply_filters('comment_author', get_comment_author() );
    351     echo $author;
    352 }
    353 
    354 function get_comment_author_email() {
    355     global $comment;
    356     return apply_filters('get_comment_author_email', $comment->comment_author_email);
    357 }
    358 
    359 function comment_author_email() {
    360     echo apply_filters('author_email', get_comment_author_email() );
    361 }
    362 
    363 function get_comment_author_link() {
    364     global $comment;
    365     $url    = get_comment_author_url();
    366     $author = get_comment_author();
    367 
    368     if ( empty( $url ) || 'http://' == $url )
    369         $return = $author;
    370     else
    371         $return = "<a href='$url' rel='external nofollow'>$author</a>";
    372     return apply_filters('get_comment_author_link', $return);
    373 }
    374 
    375 function comment_author_link() {
    376     echo get_comment_author_link();
    377 }
    378 
    379 function get_comment_type() {
    380     global $comment;
    381 
    382     if ( '' == $comment->comment_type )
    383         $comment->comment_type = 'comment';
    384 
    385     return apply_filters('get_comment_type', $comment->comment_type);
    386 }
    387 
    388 function comment_type($commenttxt = 'Comment', $trackbacktxt = 'Trackback', $pingbacktxt = 'Pingback') {
    389     $type = get_comment_type();
    390     switch( $type ) {
    391         case 'trackback' :
    392             echo $trackbacktxt;
    393             break;
    394         case 'pingback' :
    395             echo $pingbacktxt;
    396             break;
    397         default :
    398             echo $commenttxt;
    399     }
    400 }
    401 
    402 function get_comment_author_url() {
    403     global $comment;
    404     return apply_filters('get_comment_author_url', $comment->comment_author_url);
    405 }
    406 
    407 function comment_author_url() {
    408     echo apply_filters('comment_url', get_comment_author_url());
    409 }
    410 
    411 function comment_author_email_link($linktext='', $before='', $after='') {
    412     global $comment;
    413     $email = apply_filters('comment_email', $comment->comment_author_email);
    414     if ((!empty($email)) && ($email != '@')) {
    415     $display = ($linktext != '') ? $linktext : $email;
    416         echo $before;
    417         echo "<a href='mailto:$email'>$display</a>";
    418         echo $after;
    419     }
    420 }
    421 
    422 function get_comment_author_url_link( $linktext = '', $before = '', $after = '' ) {
    423     global $comment;
    424     $url = get_comment_author_url();
    425     $display = ($linktext != '') ? $linktext : $url;
    426     $return = "$before<a href='$url' rel='external'>$display</a>$after";
    427     return apply_filters('get_comment_author_url_link', $return);
    428 }
    429 
    430 function comment_author_url_link( $linktext = '', $before = '', $after = '' ) {
    431     echo get_comment_author_url_link( $linktext, $before, $after );
    432 }
    433 
    434 function get_comment_author_IP() {
    435     global $comment;
    436     return apply_filters('get_comment_author_IP', $comment->comment_author_IP);
    437 }
    438 
    439 function comment_author_IP() {
    440     echo get_comment_author_IP();
    441 }
    442 
    443 function get_comment_text() {
    444     global $comment;
    445     return apply_filters('get_comment_text', $comment->comment_content);
    446 }
    447 
    448 function comment_text() {
    449     echo apply_filters('comment_text', get_comment_text() );
    450 }
    451 
    452 function get_comment_excerpt() {
    453     global $comment;
    454     $comment_text = strip_tags($comment->comment_content);
    455     $blah = explode(' ', $comment_text);
    456     if (count($blah) > 20) {
    457         $k = 20;
    458         $use_dotdotdot = 1;
    459     } else {
    460         $k = count($blah);
    461         $use_dotdotdot = 0;
    462     }
    463     $excerpt = '';
    464     for ($i=0; $i<$k; $i++) {
    465         $excerpt .= $blah[$i] . ' ';
    466     }
    467     $excerpt .= ($use_dotdotdot) ? '...' : '';
    468     return apply_filters('get_comment_excerpt', $excerpt);
    469 }
    470 
    471 function comment_excerpt() {
    472     echo apply_filters('comment_excerpt', get_comment_excerpt() );
    473 }
    474 
    475 function get_comment_date( $d = '' ) {
    476     global $comment;
    477     if ( '' == $d )
    478         $date = mysql2date( get_settings('date_format'), $comment->comment_date);
    479     else
    480         $date = mysql2date($d, $comment->comment_date);
    481     return apply_filters('get_comment_date', $date);
    482 }
    483 
    484 function comment_date( $d = '' ) {
    485     echo get_comment_date( $d );
    486 }
    487 
    488 function get_comment_time( $d = '', $gmt = false ) {
    489     global $comment;
    490     $comment_date = $gmt? $comment->comment_date_gmt : $comment->comment_date;
    491     if ( '' == $d )
    492         $date = mysql2date(get_settings('time_format'), $comment_date);
    493     else
    494         $date = mysql2date($d, $comment_date);
    495     return apply_filters('get_comment_time', $date);
    496 }
    497 
    498 function comment_time( $d = '' ) {
    499     echo get_comment_time($d);
    500 }
    501 
    502 function get_trackback_url() {
    503     global $id;
    504     $tb_url = get_settings('siteurl') . '/wp-trackback.php?p=' . $id;
    505 
    506     if ( '' != get_settings('permalink_structure') )
    507         $tb_url = trailingslashit(get_permalink()) . 'trackback/';
    508 
    509     return $tb_url;
    510 }
    511 function trackback_url( $display = true ) {
    512     if ( $display)
    513         echo get_trackback_url();
    514     else
    515         return get_trackback_url();
    516 }
    517 
    518 function trackback_rdf($timezone = 0) {
    519     global $id;
    520     if (!stristr($_SERVER['HTTP_USER_AGENT'], 'W3C_Validator')) {
    521     echo '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    522         xmlns:dc="http://purl.org/dc/elements/1.1/"
    523         xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
    524         <rdf:Description rdf:about="';
    525     the_permalink();
    526     echo '"'."\n";
    527     echo '    dc:identifier="';
    528     the_permalink();
    529     echo '"'."\n";
    530     echo '    dc:title="'.str_replace('--', '&#x2d;&#x2d;', wptexturize(strip_tags(get_the_title()))).'"'."\n";
    531     echo '    trackback:ping="'.trackback_url(0).'"'." />\n";
    532     echo '</rdf:RDF>';
    533     }
    534 }
    535 
    536 function comments_open() {
    537     global $post;
    538     if ( 'open' == $post->comment_status )
    539         return true;
    540     else
    541         return false;
    542 }
    543 
    544 function pings_open() {
    545     global $post;
    546     if ( 'open' == $post->ping_status )
    547         return true;
    548     else
    549         return false;
    550 }
    551 
    552 // Non-template functions
    553 
    554 function get_lastcommentmodified($timezone = 'server') {
    555     global $cache_lastcommentmodified, $pagenow, $wpdb;
    556     $add_seconds_blog = get_settings('gmt_offset') * 3600;
    557     $add_seconds_server = date('Z');
    558     $now = current_time('mysql', 1);
    559     if ( !isset($cache_lastcommentmodified[$timezone]) ) {
    560         switch(strtolower($timezone)) {
    561             case 'gmt':
    562                 $lastcommentmodified = $wpdb->get_var("SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_date_gmt <= '$now' ORDER BY comment_date_gmt DESC LIMIT 1");
    563                 break;
    564             case 'blog':
    565                 $lastcommentmodified = $wpdb->get_var("SELECT comment_date FROM $wpdb->comments WHERE comment_date_gmt <= '$now' ORDER BY comment_date_gmt DESC LIMIT 1");
    566                 break;
    567             case 'server':
    568                 $lastcommentmodified = $wpdb->get_var("SELECT DATE_ADD(comment_date_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->comments WHERE comment_date_gmt <= '$now' ORDER BY comment_date_gmt DESC LIMIT 1");
    569                 break;
    570         }
    571         $cache_lastcommentmodified[$timezone] = $lastcommentmodified;
    572     } else {
    573         $lastcommentmodified = $cache_lastcommentmodified[$timezone];
    574     }
    575     return $lastcommentmodified;
    576 }
    577 
    578 function get_commentdata( $comment_ID, $no_cache = 0, $include_unapproved = false ) { // less flexible, but saves DB queries
    579     global $postc, $id, $commentdata, $wpdb;
    580     if ($no_cache) {
    581         $query = "SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_ID'";
    582         if (false == $include_unapproved) {
    583             $query .= " AND comment_approved = '1'";
    584         }
    585             $myrow = $wpdb->get_row($query, ARRAY_A);
    586     } else {
    587         $myrow['comment_ID'] = $postc->comment_ID;
    588         $myrow['comment_post_ID'] = $postc->comment_post_ID;
    589         $myrow['comment_author'] = $postc->comment_author;
    590         $myrow['comment_author_email'] = $postc->comment_author_email;
    591         $myrow['comment_author_url'] = $postc->comment_author_url;
    592         $myrow['comment_author_IP'] = $postc->comment_author_IP;
    593         $myrow['comment_date'] = $postc->comment_date;
    594         $myrow['comment_content'] = $postc->comment_content;
    595         $myrow['comment_karma'] = $postc->comment_karma;
    596         $myrow['comment_approved'] = $postc->comment_approved;
    597         $myrow['comment_type'] = $postc->comment_type;
    598     }
    599     return $myrow;
    600 }
    601 
    602 function pingback($content, $post_ID) {
    603     global $wp_version, $wpdb;
    604     include_once (ABSPATH . WPINC . '/class-IXR.php');
    605 
    606     // original code by Mort (http://mort.mine.nu:8080)
    607     $log = debug_fopen(ABSPATH . '/pingback.log', 'a');
    608     $post_links = array();
    609     debug_fwrite($log, 'BEGIN '.date('YmdHis', time())."\n");
    610 
    611     $pung = get_pung($post_ID);
    612 
    613     // Variables
    614     $ltrs = '\w';
    615     $gunk = '/#~:.?+=&%@!\-';
    616     $punc = '.:?\-';
    617     $any = $ltrs . $gunk . $punc;
    618 
    619     // Step 1
    620     // Parsing the post, external links (if any) are stored in the $post_links array
    621     // This regexp comes straight from phpfreaks.com
    622     // http://www.phpfreaks.com/quickcode/Extract_All_URLs_on_a_Page/15.php
    623     preg_match_all("{\b http : [$any] +? (?= [$punc] * [^$any] | $)}x", $content, $post_links_temp);
    624 
    625     // Debug
    626     debug_fwrite($log, 'Post contents:');
    627     debug_fwrite($log, $content."\n");
    628 
    629     // Step 2.
    630     // Walking thru the links array
    631     // first we get rid of links pointing to sites, not to specific files
    632     // Example:
    633     // http://dummy-weblog.org
    634     // http://dummy-weblog.org/
    635     // http://dummy-weblog.org/post.php
    636     // We don't wanna ping first and second types, even if they have a valid <link/>
    637 
    638     foreach($post_links_temp[0] as $link_test) :
    639         if ( !in_array($link_test, $pung) && (url_to_postid($link_test) != $post_ID) // If we haven't pung it already and it isn't a link to itself
    640                 && !is_local_attachment($link_test) ) : // Also, let's never ping local attachments.
    641             $test = parse_url($link_test);
    642             if (isset($test['query']))
    643                 $post_links[] = $link_test;
    644             elseif(($test['path'] != '/') && ($test['path'] != ''))
    645                 $post_links[] = $link_test;
    646         endif;
    647     endforeach;
    648 
    649     do_action('pre_ping',  array(&$post_links, &$pung));
    650 
    651     foreach ($post_links as $pagelinkedto){
    652         debug_fwrite($log, "Processing -- $pagelinkedto\n");
    653         $pingback_server_url = discover_pingback_server_uri($pagelinkedto, 2048);
    654 
    655         if ($pingback_server_url) {
    656             @ set_time_limit( 60 );
    657              // Now, the RPC call
    658             debug_fwrite($log, "Page Linked To: $pagelinkedto \n");
    659             debug_fwrite($log, 'Page Linked From: ');
    660             $pagelinkedfrom = get_permalink($post_ID);
    661             debug_fwrite($log, $pagelinkedfrom."\n");
    662 
    663             // using a timeout of 3 seconds should be enough to cover slow servers
    664             $client = new IXR_Client($pingback_server_url);
    665             $client->timeout = 3;
    666             $client->useragent .= ' -- WordPress/' . $wp_version;
    667 
    668             // when set to true, this outputs debug messages by itself
    669             $client->debug = false;
    670 
    671             if ( $client->query('pingback.ping', $pagelinkedfrom, $pagelinkedto ) )
    672                 add_ping( $post_ID, $pagelinkedto );
    673             else
    674                 debug_fwrite($log, "Error.\n Fault code: ".$client->getErrorCode()." : ".$client->getErrorMessage()."\n");
    675         }
    676     }
    677 
    678     debug_fwrite($log, "\nEND: ".time()."\n****************************\n");
    679     debug_fclose($log);
    680 }
    681 
    682 function discover_pingback_server_uri($url, $timeout_bytes = 2048) {
    683     global $wp_version;
    684 
    685     $byte_count = 0;
    686     $contents = '';
    687     $headers = '';
    688     $pingback_str_dquote = 'rel="pingback"';
    689     $pingback_str_squote = 'rel=\'pingback\'';
    690     $x_pingback_str = 'x-pingback: ';
    691     $pingback_href_original_pos = 27;
    692 
    693     extract(parse_url($url));
    694 
    695     if (!isset($host)) {
    696         // Not an URL. This should never happen.
    697         return false;
    698     }
    699 
    700     $path  = (!isset($path)) ? '/'        : $path;
    701     $path .= (isset($query)) ? '?'.$query : '';
    702     $port  = (isset($port))  ? $port      : 80;
    703 
    704     // Try to connect to the server at $host
    705     $fp = @fsockopen($host, $port, $errno, $errstr, 2);
    706     if (!$fp) {
    707         // Couldn't open a connection to $host;
    708         return false;
    709     }
    710 
    711     // Send the GET request
    712     $request = "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: WordPress/$wp_version \r\n\r\n";
    713 //  ob_end_flush();
    714     fputs($fp, $request);
    715 
    716     // Let's check for an X-Pingback header first
    717     while (!feof($fp)) {
    718         $line = fgets($fp, 512);
    719         if (trim($line) == '') {
    720             break;
    721         }
    722         $headers .= trim($line)."\n";
    723         $x_pingback_header_offset = strpos(strtolower($headers), $x_pingback_str);
    724         if ($x_pingback_header_offset) {
    725             // We got it!
    726             preg_match('#x-pingback: (.+)#is', $headers, $matches);
    727             $pingback_server_url = trim($matches[1]);
    728             return $pingback_server_url;
    729         }
    730         if(strpos(strtolower($headers), 'content-type: ')) {
    731             preg_match('#content-type: (.+)#is', $headers, $matches);
    732             $content_type = trim($matches[1]);
    733         }
    734     }
    735 
    736     if (preg_match('#(image|audio|video|model)/#is', $content_type)) {
    737         // Not an (x)html, sgml, or xml page, no use going further
    738         return false;
    739     }
    740 
    741     while (!feof($fp)) {
    742         $line = fgets($fp, 1024);
    743         $contents .= trim($line);
    744         $pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote);
    745         $pingback_link_offset_squote = strpos($contents, $pingback_str_squote);
    746         if ($pingback_link_offset_dquote || $pingback_link_offset_squote) {
    747             $quote = ($pingback_link_offset_dquote) ? '"' : '\'';
    748             $pingback_link_offset = ($quote=='"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote;
    749             $pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset);
    750             $pingback_href_start = $pingback_href_pos+6;
    751             $pingback_href_end = @strpos($contents, $quote, $pingback_href_start);
    752             $pingback_server_url_len = $pingback_href_end - $pingback_href_start;
    753             $pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len);
    754             // We may find rel="pingback" but an incomplete pingback URI
    755             if ($pingback_server_url_len > 0) {
    756                 // We got it!
    757                 return $pingback_server_url;
    758             }
    759         }
    760         $byte_count += strlen($line);
    761         if ($byte_count > $timeout_bytes) {
    762             // It's no use going further, there probably isn't any pingback
    763             // server to find in this file. (Prevents loading large files.)
    764             return false;
    765         }
    766     }
    767 
    768     // We didn't find anything.
    769     return false;
    770 }
    771 
    772 function is_local_attachment($url) {
    773     if ( !strstr($url, get_bloginfo('home') ) )
    774         return false;
    775     if ( strstr($url, get_bloginfo('home') . '/?attachment_id=') )
    776         return true;
    777     if ( $id = url_to_postid($url) ) {
    778         $post = & get_post($id);
    779         if ( 'attachment' == $post->post_type )
    780             return true;
    781     }
    782     return false;
    783 }
    784 
    785 function wp_set_comment_status($comment_id, $comment_status) {
    786     global $wpdb;
    787 
    788     switch($comment_status) {
    789         case 'hold':
    790             $query = "UPDATE $wpdb->comments SET comment_approved='0' WHERE comment_ID='$comment_id' LIMIT 1";
    791         break;
    792         case 'approve':
    793             $query = "UPDATE $wpdb->comments SET comment_approved='1' WHERE comment_ID='$comment_id' LIMIT 1";
    794         break;
    795         case 'spam':
    796             $query = "UPDATE $wpdb->comments SET comment_approved='spam' WHERE comment_ID='$comment_id' LIMIT 1";
    797         break;
    798         case 'delete':
    799             return wp_delete_comment($comment_id);
    800         break;
    801         default:
    802             return false;
    803     }
    804    
    805     if ($wpdb->query($query)) {
    806         do_action('wp_set_comment_status', $comment_id, $comment_status);
    807 
    808         $comment = get_comment($comment_id);
    809         $comment_post_ID = $comment->comment_post_ID;
    810         $c = $wpdb->get_row( "SELECT count(*) as c FROM {$wpdb->comments} WHERE comment_post_ID = '$comment_post_ID' AND comment_approved = '1'" );
    811         if( is_object( $c ) )
    812             $wpdb->query( "UPDATE $wpdb->posts SET comment_count = '$c->c' WHERE ID = '$comment_post_ID'" );
    813         return true;
    814     } else {
    815         return false;
    816     }
    817 }
    818 
    819 function wp_get_comment_status($comment_id) {
    820     global $wpdb;
    821 
    822     $result = $wpdb->get_var("SELECT comment_approved FROM $wpdb->comments WHERE comment_ID='$comment_id' LIMIT 1");
    823     if ($result == NULL) {
    824         return 'deleted';
    825     } else if ($result == '1') {
    826         return 'approved';
    827     } else if ($result == '0') {
    828         return 'unapproved';
    829     } else if ($result == 'spam') {
    830         return 'spam';
    831     } else {
    832         return false;
    833     }
    834 }
    8352
    8363function check_comment($author, $email, $url, $comment, $user_ip, $user_agent, $comment_type) {
     
    89764}
    89865
     66// Retrieves comment data given a comment ID or comment object.
     67// Handles comment caching.
     68function &get_comment(&$comment, $output = OBJECT) {
     69    global $comment_cache, $wpdb;
     70
     71    if ( empty($comment) )
     72        return null;
     73
     74    if ( is_object($comment) ) {
     75        if ( !isset($comment_cache[$comment->comment_ID]) )
     76            $comment_cache[$comment->comment_ID] = &$comment;
     77        $_comment = & $comment_cache[$comment->comment_ID];
     78    } else {
     79        if ( !isset($comment_cache[$comment]) ) {
     80            $_comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment' LIMIT 1");
     81            $comment_cache[$comment->comment_ID] = & $_comment;
     82        } else {
     83            $_comment = & $comment_cache[$comment];
     84        }
     85    }
     86
     87    if ( $output == OBJECT ) {
     88        return $_comment;
     89    } elseif ( $output == ARRAY_A ) {
     90        return get_object_vars($_comment);
     91    } elseif ( $output == ARRAY_N ) {
     92        return array_values(get_object_vars($_comment));
     93    } else {
     94        return $_comment;
     95    }
     96}
     97
     98// Deprecate in favor of get_comment()?
     99function get_commentdata( $comment_ID, $no_cache = 0, $include_unapproved = false ) { // less flexible, but saves DB queries
     100    global $postc, $id, $commentdata, $wpdb;
     101    if ($no_cache) {
     102        $query = "SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_ID'";
     103        if (false == $include_unapproved) {
     104            $query .= " AND comment_approved = '1'";
     105        }
     106            $myrow = $wpdb->get_row($query, ARRAY_A);
     107    } else {
     108        $myrow['comment_ID'] = $postc->comment_ID;
     109        $myrow['comment_post_ID'] = $postc->comment_post_ID;
     110        $myrow['comment_author'] = $postc->comment_author;
     111        $myrow['comment_author_email'] = $postc->comment_author_email;
     112        $myrow['comment_author_url'] = $postc->comment_author_url;
     113        $myrow['comment_author_IP'] = $postc->comment_author_IP;
     114        $myrow['comment_date'] = $postc->comment_date;
     115        $myrow['comment_content'] = $postc->comment_content;
     116        $myrow['comment_karma'] = $postc->comment_karma;
     117        $myrow['comment_approved'] = $postc->comment_approved;
     118        $myrow['comment_type'] = $postc->comment_type;
     119    }
     120    return $myrow;
     121}
     122
     123function get_lastcommentmodified($timezone = 'server') {
     124    global $cache_lastcommentmodified, $pagenow, $wpdb;
     125    $add_seconds_blog = get_settings('gmt_offset') * 3600;
     126    $add_seconds_server = date('Z');
     127    $now = current_time('mysql', 1);
     128    if ( !isset($cache_lastcommentmodified[$timezone]) ) {
     129        switch(strtolower($timezone)) {
     130            case 'gmt':
     131                $lastcommentmodified = $wpdb->get_var("SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_date_gmt <= '$now' ORDER BY comment_date_gmt DESC LIMIT 1");
     132                break;
     133            case 'blog':
     134                $lastcommentmodified = $wpdb->get_var("SELECT comment_date FROM $wpdb->comments WHERE comment_date_gmt <= '$now' ORDER BY comment_date_gmt DESC LIMIT 1");
     135                break;
     136            case 'server':
     137                $lastcommentmodified = $wpdb->get_var("SELECT DATE_ADD(comment_date_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->comments WHERE comment_date_gmt <= '$now' ORDER BY comment_date_gmt DESC LIMIT 1");
     138                break;
     139        }
     140        $cache_lastcommentmodified[$timezone] = $lastcommentmodified;
     141    } else {
     142        $lastcommentmodified = $cache_lastcommentmodified[$timezone];
     143    }
     144    return $lastcommentmodified;
     145}
     146
     147function wp_allow_comment($commentdata) {
     148    global $wpdb;
     149    extract($commentdata);
     150
     151    $comment_user_domain = apply_filters('pre_comment_user_domain', gethostbyaddr($comment_author_IP) );
     152
     153    // Simple duplicate check
     154    $dupe = "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND ( comment_author = '$comment_author' ";
     155    if ( $comment_author_email )
     156        $dupe .= "OR comment_author_email = '$comment_author_email' ";
     157    $dupe .= ") AND comment_content = '$comment_content' LIMIT 1";
     158    if ( $wpdb->get_var($dupe) )
     159        die( __('Duplicate comment detected; it looks as though you\'ve already said that!') );
     160
     161    // Simple flood-protection
     162    if ( $lasttime = $wpdb->get_var("SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_author_IP = '$comment_author_IP' OR comment_author_email = '$comment_author_email' ORDER BY comment_date DESC LIMIT 1") ) {
     163        $time_lastcomment = mysql2date('U', $lasttime);
     164        $time_newcomment  = mysql2date('U', $comment_date_gmt);
     165        if ( ($time_newcomment - $time_lastcomment) < 15 ) {
     166            do_action('comment_flood_trigger', $time_lastcomment, $time_newcomment);
     167            die( __('Sorry, you can only post a new comment once every 15 seconds. Slow down cowboy.') );
     168        }
     169    }
     170
     171    if ( $user_id ) {
     172        $userdata = get_userdata($user_id);
     173        $user = new WP_User($user_id);
     174        $post_author = $wpdb->get_var("SELECT post_author FROM $wpdb->posts WHERE ID = '$comment_post_ID' LIMIT 1");
     175    }
     176
     177    // The author and the admins get respect.
     178    if ( $userdata && ( $user_id == $post_author || $user->has_cap('level_9') ) ) {
     179        $approved = 1;
     180    }
     181
     182    // Everyone else's comments will be checked.
     183    else {
     184        if ( check_comment($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent, $comment_type) )
     185            $approved = 1;
     186        else
     187            $approved = 0;
     188        if ( wp_blacklist_check($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent) )
     189            $approved = 'spam';
     190    }
     191
     192    $approved = apply_filters('pre_comment_approved', $approved);
     193    return $approved;
     194}
     195
     196function wp_delete_comment($comment_id) {
     197    global $wpdb;
     198    do_action('delete_comment', $comment_id);
     199
     200    $comment = get_comment($comment_id);
     201
     202    if ( ! $wpdb->query("DELETE FROM $wpdb->comments WHERE comment_ID='$comment_id' LIMIT 1") )
     203        return false;
     204
     205    $post_id = $comment->comment_post_ID;
     206    if ( $post_id && $comment->comment_approved == 1 )
     207        $wpdb->query( "UPDATE $wpdb->posts SET comment_count = comment_count - 1 WHERE ID = '$post_id'" );
     208
     209    do_action('wp_set_comment_status', $comment_id, 'delete');
     210    return true;
     211}
     212
     213function wp_get_comment_status($comment_id) {
     214    global $wpdb;
     215
     216    $result = $wpdb->get_var("SELECT comment_approved FROM $wpdb->comments WHERE comment_ID='$comment_id' LIMIT 1");
     217    if ($result == NULL) {
     218        return 'deleted';
     219    } else if ($result == '1') {
     220        return 'approved';
     221    } else if ($result == '0') {
     222        return 'unapproved';
     223    } else if ($result == 'spam') {
     224        return 'spam';
     225    } else {
     226        return false;
     227    }
     228}
     229
     230function wp_insert_comment($commentdata) {
     231    global $wpdb;
     232    extract($commentdata);
     233
     234    if ( ! isset($comment_author_IP) )
     235        $comment_author_IP = $_SERVER['REMOTE_ADDR'];
     236    if ( ! isset($comment_date) )
     237        $comment_date = current_time('mysql');
     238    if ( ! isset($comment_date_gmt) )
     239        $comment_date_gmt = gmdate('Y-m-d H:i:s', strtotime($comment_date) );
     240    if ( ! isset($comment_parent) )
     241        $comment_parent = 0;
     242    if ( ! isset($comment_approved) )
     243        $comment_approved = 1;
     244    if ( ! isset($user_id) )
     245        $user_id = 0;
     246
     247    $result = $wpdb->query("INSERT INTO $wpdb->comments
     248    (comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_date_gmt, comment_content, comment_approved, comment_agent, comment_type, comment_parent, user_id)
     249    VALUES
     250    ('$comment_post_ID', '$comment_author', '$comment_author_email', '$comment_author_url', '$comment_author_IP', '$comment_date', '$comment_date_gmt', '$comment_content', '$comment_approved', '$comment_agent', '$comment_type', '$comment_parent', '$user_id')
     251    ");
     252
     253    $id = $wpdb->insert_id;
     254
     255    if ( $comment_approved == 1) {
     256        $count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND comment_approved = '1'");
     257        $wpdb->query( "UPDATE $wpdb->posts SET comment_count = $count WHERE ID = '$comment_post_ID'" );
     258    }
     259    return $id;
     260}
     261
     262function wp_filter_comment($commentdata) {
     263    $commentdata['user_id']              = apply_filters('pre_user_id', $commentdata['user_ID']);
     264    $commentdata['comment_agent']        = apply_filters('pre_comment_user_agent', $commentdata['comment_agent']);
     265    $commentdata['comment_author']       = apply_filters('pre_comment_author_name', $commentdata['comment_author']);
     266    $commentdata['comment_content']      = apply_filters('pre_comment_content', $commentdata['comment_content']);
     267    $commentdata['comment_author_IP']    = apply_filters('pre_comment_user_ip', $commentdata['comment_author_IP']);
     268    $commentdata['comment_author_url']   = apply_filters('pre_comment_author_url', $commentdata['comment_author_url']);
     269    $commentdata['comment_author_email'] = apply_filters('pre_comment_author_email', $commentdata['comment_author_email']);
     270    $commentdata['filtered'] = true;
     271    return $commentdata;
     272}
     273
     274function wp_new_comment( $commentdata ) {
     275    $commentdata = apply_filters('preprocess_comment', $commentdata);
     276
     277    $commentdata['comment_post_ID'] = (int) $commentdata['comment_post_ID'];
     278    $commentdata['user_ID']         = (int) $commentdata['user_ID'];
     279
     280    $commentdata['comment_author_IP'] = $_SERVER['REMOTE_ADDR'];
     281    $commentdata['comment_agent']     = $_SERVER['HTTP_USER_AGENT'];
     282
     283    $commentdata['comment_date']     = current_time('mysql');
     284    $commentdata['comment_date_gmt'] = current_time('mysql', 1);
     285
     286
     287    $commentdata = wp_filter_comment($commentdata);
     288
     289    $commentdata['comment_approved'] = wp_allow_comment($commentdata);
     290
     291    $comment_ID = wp_insert_comment($commentdata);
     292
     293    do_action('comment_post', $comment_ID, $commentdata['comment_approved']);
     294
     295    if ( 'spam' !== $commentdata['comment_approved'] ) { // If it's spam save it silently for later crunching
     296        if ( '0' == $commentdata['comment_approved'] )
     297            wp_notify_moderator($comment_ID);
     298
     299        $post = &get_post($commentdata['comment_post_ID']); // Don't notify if it's your own comment
     300
     301        if ( get_settings('comments_notify') && $commentdata['comment_approved'] && $post->post_author != $commentdata['user_ID'] )
     302            wp_notify_postauthor($comment_ID, $commentdata['comment_type']);
     303    }
     304
     305    return $comment_ID;
     306}
     307
     308function wp_set_comment_status($comment_id, $comment_status) {
     309    global $wpdb;
     310
     311    switch($comment_status) {
     312        case 'hold':
     313            $query = "UPDATE $wpdb->comments SET comment_approved='0' WHERE comment_ID='$comment_id' LIMIT 1";
     314        break;
     315        case 'approve':
     316            $query = "UPDATE $wpdb->comments SET comment_approved='1' WHERE comment_ID='$comment_id' LIMIT 1";
     317        break;
     318        case 'spam':
     319            $query = "UPDATE $wpdb->comments SET comment_approved='spam' WHERE comment_ID='$comment_id' LIMIT 1";
     320        break;
     321        case 'delete':
     322            return wp_delete_comment($comment_id);
     323        break;
     324        default:
     325            return false;
     326    }
     327   
     328    if ($wpdb->query($query)) {
     329        do_action('wp_set_comment_status', $comment_id, $comment_status);
     330
     331        $comment = get_comment($comment_id);
     332        $comment_post_ID = $comment->comment_post_ID;
     333        $c = $wpdb->get_row( "SELECT count(*) as c FROM {$wpdb->comments} WHERE comment_post_ID = '$comment_post_ID' AND comment_approved = '1'" );
     334        if( is_object( $c ) )
     335            $wpdb->query( "UPDATE $wpdb->posts SET comment_count = '$c->c' WHERE ID = '$comment_post_ID'" );
     336        return true;
     337    } else {
     338        return false;
     339    }
     340}
     341
     342function wp_update_comment($commentarr) {
     343    global $wpdb;
     344
     345    // First, get all of the original fields
     346    $comment = get_comment($commentarr['comment_ID'], ARRAY_A);
     347
     348    // Escape data pulled from DB.
     349    foreach ($comment as $key => $value)
     350        $comment[$key] = $wpdb->escape($value);
     351
     352    // Merge old and new fields with new fields overwriting old ones.
     353    $commentarr = array_merge($comment, $commentarr);
     354
     355    $commentarr = wp_filter_comment( $commentarr );
     356
     357    // Now extract the merged array.
     358    extract($commentarr);
     359
     360    $comment_content = apply_filters('comment_save_pre', $comment_content);
     361
     362    $result = $wpdb->query(
     363        "UPDATE $wpdb->comments SET
     364            comment_content = '$comment_content',
     365            comment_author = '$comment_author',
     366            comment_author_email = '$comment_author_email',
     367            comment_approved = '$comment_approved',
     368            comment_author_url = '$comment_author_url',
     369            comment_date = '$comment_date'
     370        WHERE comment_ID = $comment_ID" );
     371
     372    $rval = $wpdb->rows_affected;
     373
     374    $c = $wpdb->get_row( "SELECT count(*) as c FROM {$wpdb->comments} WHERE comment_post_ID = '$comment_post_ID' AND comment_approved = '1'" );
     375    if( is_object( $c ) )
     376        $wpdb->query( "UPDATE $wpdb->posts SET comment_count = '$c->c' WHERE ID = '$comment_post_ID'" );
     377
     378    do_action('edit_comment', $comment_ID);
     379
     380    return $rval;
     381}
     382
     383function pingback($content, $post_ID) {
     384    global $wp_version, $wpdb;
     385    include_once (ABSPATH . WPINC . '/class-IXR.php');
     386
     387    // original code by Mort (http://mort.mine.nu:8080)
     388    $log = debug_fopen(ABSPATH . '/pingback.log', 'a');
     389    $post_links = array();
     390    debug_fwrite($log, 'BEGIN '.date('YmdHis', time())."\n");
     391
     392    $pung = get_pung($post_ID);
     393
     394    // Variables
     395    $ltrs = '\w';
     396    $gunk = '/#~:.?+=&%@!\-';
     397    $punc = '.:?\-';
     398    $any = $ltrs . $gunk . $punc;
     399
     400    // Step 1
     401    // Parsing the post, external links (if any) are stored in the $post_links array
     402    // This regexp comes straight from phpfreaks.com
     403    // http://www.phpfreaks.com/quickcode/Extract_All_URLs_on_a_Page/15.php
     404    preg_match_all("{\b http : [$any] +? (?= [$punc] * [^$any] | $)}x", $content, $post_links_temp);
     405
     406    // Debug
     407    debug_fwrite($log, 'Post contents:');
     408    debug_fwrite($log, $content."\n");
     409
     410    // Step 2.
     411    // Walking thru the links array
     412    // first we get rid of links pointing to sites, not to specific files
     413    // Example:
     414    // http://dummy-weblog.org
     415    // http://dummy-weblog.org/
     416    // http://dummy-weblog.org/post.php
     417    // We don't wanna ping first and second types, even if they have a valid <link/>
     418
     419    foreach($post_links_temp[0] as $link_test) :
     420        if ( !in_array($link_test, $pung) && (url_to_postid($link_test) != $post_ID) // If we haven't pung it already and it isn't a link to itself
     421                && !is_local_attachment($link_test) ) : // Also, let's never ping local attachments.
     422            $test = parse_url($link_test);
     423            if (isset($test['query']))
     424                $post_links[] = $link_test;
     425            elseif(($test['path'] != '/') && ($test['path'] != ''))
     426                $post_links[] = $link_test;
     427        endif;
     428    endforeach;
     429
     430    do_action('pre_ping',  array(&$post_links, &$pung));
     431
     432    foreach ($post_links as $pagelinkedto){
     433        debug_fwrite($log, "Processing -- $pagelinkedto\n");
     434        $pingback_server_url = discover_pingback_server_uri($pagelinkedto, 2048);
     435
     436        if ($pingback_server_url) {
     437            @ set_time_limit( 60 );
     438             // Now, the RPC call
     439            debug_fwrite($log, "Page Linked To: $pagelinkedto \n");
     440            debug_fwrite($log, 'Page Linked From: ');
     441            $pagelinkedfrom = get_permalink($post_ID);
     442            debug_fwrite($log, $pagelinkedfrom."\n");
     443
     444            // using a timeout of 3 seconds should be enough to cover slow servers
     445            $client = new IXR_Client($pingback_server_url);
     446            $client->timeout = 3;
     447            $client->useragent .= ' -- WordPress/' . $wp_version;
     448
     449            // when set to true, this outputs debug messages by itself
     450            $client->debug = false;
     451
     452            if ( $client->query('pingback.ping', $pagelinkedfrom, $pagelinkedto ) )
     453                add_ping( $post_ID, $pagelinkedto );
     454            else
     455                debug_fwrite($log, "Error.\n Fault code: ".$client->getErrorCode()." : ".$client->getErrorMessage()."\n");
     456        }
     457    }
     458
     459    debug_fwrite($log, "\nEND: ".time()."\n****************************\n");
     460    debug_fclose($log);
     461}
     462
     463function discover_pingback_server_uri($url, $timeout_bytes = 2048) {
     464    global $wp_version;
     465
     466    $byte_count = 0;
     467    $contents = '';
     468    $headers = '';
     469    $pingback_str_dquote = 'rel="pingback"';
     470    $pingback_str_squote = 'rel=\'pingback\'';
     471    $x_pingback_str = 'x-pingback: ';
     472    $pingback_href_original_pos = 27;
     473
     474    extract(parse_url($url));
     475
     476    if (!isset($host)) {
     477        // Not an URL. This should never happen.
     478        return false;
     479    }
     480
     481    $path  = (!isset($path)) ? '/'        : $path;
     482    $path .= (isset($query)) ? '?'.$query : '';
     483    $port  = (isset($port))  ? $port      : 80;
     484
     485    // Try to connect to the server at $host
     486    $fp = @fsockopen($host, $port, $errno, $errstr, 2);
     487    if (!$fp) {
     488        // Couldn't open a connection to $host;
     489        return false;
     490    }
     491
     492    // Send the GET request
     493    $request = "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: WordPress/$wp_version \r\n\r\n";
     494//  ob_end_flush();
     495    fputs($fp, $request);
     496
     497    // Let's check for an X-Pingback header first
     498    while (!feof($fp)) {
     499        $line = fgets($fp, 512);
     500        if (trim($line) == '') {
     501            break;
     502        }
     503        $headers .= trim($line)."\n";
     504        $x_pingback_header_offset = strpos(strtolower($headers), $x_pingback_str);
     505        if ($x_pingback_header_offset) {
     506            // We got it!
     507            preg_match('#x-pingback: (.+)#is', $headers, $matches);
     508            $pingback_server_url = trim($matches[1]);
     509            return $pingback_server_url;
     510        }
     511        if(strpos(strtolower($headers), 'content-type: ')) {
     512            preg_match('#content-type: (.+)#is', $headers, $matches);
     513            $content_type = trim($matches[1]);
     514        }
     515    }
     516
     517    if (preg_match('#(image|audio|video|model)/#is', $content_type)) {
     518        // Not an (x)html, sgml, or xml page, no use going further
     519        return false;
     520    }
     521
     522    while (!feof($fp)) {
     523        $line = fgets($fp, 1024);
     524        $contents .= trim($line);
     525        $pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote);
     526        $pingback_link_offset_squote = strpos($contents, $pingback_str_squote);
     527        if ($pingback_link_offset_dquote || $pingback_link_offset_squote) {
     528            $quote = ($pingback_link_offset_dquote) ? '"' : '\'';
     529            $pingback_link_offset = ($quote=='"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote;
     530            $pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset);
     531            $pingback_href_start = $pingback_href_pos+6;
     532            $pingback_href_end = @strpos($contents, $quote, $pingback_href_start);
     533            $pingback_server_url_len = $pingback_href_end - $pingback_href_start;
     534            $pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len);
     535            // We may find rel="pingback" but an incomplete pingback URI
     536            if ($pingback_server_url_len > 0) {
     537                // We got it!
     538                return $pingback_server_url;
     539            }
     540        }
     541        $byte_count += strlen($line);
     542        if ($byte_count > $timeout_bytes) {
     543            // It's no use going further, there probably isn't any pingback
     544            // server to find in this file. (Prevents loading large files.)
     545            return false;
     546        }
     547    }
     548
     549    // We didn't find anything.
     550    return false;
     551}
     552
     553function is_local_attachment($url) {
     554    if ( !strstr($url, get_bloginfo('home') ) )
     555        return false;
     556    if ( strstr($url, get_bloginfo('home') . '/?attachment_id=') )
     557        return true;
     558    if ( $id = url_to_postid($url) ) {
     559        $post = & get_post($id);
     560        if ( 'attachment' == $post->post_type )
     561            return true;
     562    }
     563    return false;
     564}
     565
    899566?>
  • trunk/wp-includes/functions.php

    r3712 r3714  
    688688    } else {
    689689        return $_category;
    690     }
    691 }
    692 
    693 // Retrieves comment data given a comment ID or comment object.
    694 // Handles comment caching.
    695 function &get_comment(&$comment, $output = OBJECT) {
    696     global $comment_cache, $wpdb;
    697 
    698     if ( empty($comment) )
    699         return null;
    700 
    701     if ( is_object($comment) ) {
    702         if ( !isset($comment_cache[$comment->comment_ID]) )
    703             $comment_cache[$comment->comment_ID] = &$comment;
    704         $_comment = & $comment_cache[$comment->comment_ID];
    705     } else {
    706         if ( !isset($comment_cache[$comment]) ) {
    707             $_comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment' LIMIT 1");
    708             $comment_cache[$comment->comment_ID] = & $_comment;
    709         } else {
    710             $_comment = & $comment_cache[$comment];
    711         }
    712     }
    713 
    714     if ( $output == OBJECT ) {
    715         return $_comment;
    716     } elseif ( $output == ARRAY_A ) {
    717         return get_object_vars($_comment);
    718     } elseif ( $output == ARRAY_N ) {
    719         return array_values(get_object_vars($_comment));
    720     } else {
    721         return $_comment;
    722690    }
    723691}
  • trunk/wp-settings.php

    r3711 r3714  
    110110    require (ABSPATH . WPINC . '/cache.php');
    111111
    112 // To disable persistant caching, add the below line to your wp-config.php file, uncommented of course.
    113 // define('DISABLE_CACHE', true);
    114 
    115112wp_cache_init();
    116113
     
    126123    die(sprintf(__("It doesn't look like you've installed WP yet. Try running <a href='%s'>install.php</a>."), $link));
    127124}
    128 $wpdb->show_errors();
    129125
    130126require (ABSPATH . WPINC . '/functions-formatting.php');
     
    139135require (ABSPATH . WPINC . '/template-functions-post.php');
    140136require (ABSPATH . WPINC . '/template-functions-category.php');
    141 require (ABSPATH . WPINC . '/comment-functions.php');
     137require (ABSPATH . WPINC . '/comment.php');
     138require (ABSPATH . WPINC . '/comment-template.php');
    142139require (ABSPATH . WPINC . '/rewrite.php');
    143140require (ABSPATH . WPINC . '/feed-functions.php');
Note: See TracChangeset for help on using the changeset viewer.