Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to override a WordPress core function

I'm trying to edit the error message that appears when you hit Add comment button (from Admin panel) without typing a comment.

Here's wp_ajax_replyto_comment function (from wp-admin/includes/ajax-actions.php) that handles this error message.

function wp_ajax_replyto_comment( $action ) {
    global $wp_list_table, $wpdb;
    if ( empty( $action ) )
        $action = 'replyto-comment';

    check_ajax_referer( $action, '_ajax_nonce-replyto-comment' );

    set_current_screen( 'edit-comments' );

    $comment_post_ID = (int) $_POST['comment_post_ID'];
    if ( !current_user_can( 'edit_post', $comment_post_ID ) )
        wp_die( -1 );

    $status = $wpdb->get_var( $wpdb->prepare("SELECT post_status FROM $wpdb->posts WHERE ID = %d", $comment_post_ID) );

    if ( empty($status) )
        wp_die( 1 );
    elseif ( in_array($status, array('draft', 'pending', 'trash') ) )
        wp_die( __('ERROR: you are replying to a comment on a draft post.') );

    $user = wp_get_current_user();
    if ( $user->exists() ) {
        $user_ID = $user->ID;
        $comment_author       = $wpdb->escape($user->display_name);
        $comment_author_email = $wpdb->escape($user->user_email);
        $comment_author_url   = $wpdb->escape($user->user_url);
        $comment_content      = trim($_POST['content']);
        if ( current_user_can( 'unfiltered_html' ) ) {
            if ( wp_create_nonce( 'unfiltered-html-comment' ) != $_POST['_wp_unfiltered_html_comment'] ) {
                kses_remove_filters(); // start with a clean slate
                kses_init_filters(); // set up the filters
            }
        }
    } else {
        wp_die( __( 'Sorry, you must be logged in to reply to a comment.' ) );
    }

    if ( '' == $comment_content )
        wp_die( __( 'ERROR: please type a comment.' ) );

    $comment_parent = absint($_POST['comment_ID']);
    $comment_auto_approved = false;
    $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID');

    $comment_id = wp_new_comment( $commentdata );
    $comment = get_comment($comment_id);
    if ( ! $comment ) wp_die( 1 );

    $position = ( isset($_POST['position']) && (int) $_POST['position'] ) ? (int) $_POST['position'] : '-1';

    // automatically approve parent comment
    if ( !empty($_POST['approve_parent']) ) {
        $parent = get_comment( $comment_parent );

        if ( $parent && $parent->comment_approved === '0' && $parent->comment_post_ID == $comment_post_ID ) {
            if ( wp_set_comment_status( $parent->comment_ID, 'approve' ) )
                $comment_auto_approved = true;
        }
    }

    ob_start();
        if ( 'dashboard' == $_REQUEST['mode'] ) {
            require_once( ABSPATH . 'wp-admin/includes/dashboard.php' );
            _wp_dashboard_recent_comments_row( $comment );
        } else {
            if ( 'single' == $_REQUEST['mode'] ) {
                $wp_list_table = _get_list_table('WP_Post_Comments_List_Table');
            } else {
                $wp_list_table = _get_list_table('WP_Comments_List_Table');
            }
            $wp_list_table->single_row( $comment );
        }
        $comment_list_item = ob_get_contents();
    ob_end_clean();

    $response =  array(
        'what' => 'comment',
        'id' => $comment->comment_ID,
        'data' => $comment_list_item,
        'position' => $position
    );

    if ( $comment_auto_approved )
        $response['supplemental'] = array( 'parent_approved' => $parent->comment_ID );

    $x = new WP_Ajax_Response();
    $x->add( $response );
    $x->send();
}

I want to override this part only:

if ( '' == $comment_content )
        wp_die( __( 'ERROR: please type a comment.' ) );

Here is my code which is placed in my theme's functions.php

function my_function_name() {
    if ( '' == $comment_content )
        wp_die( __( 'My custom message here' ) );
}
add_filter( 'wp_ajax_replyto_comment', 'my_function_name' );

Unfortunately, my code doesn't work. Please help me! Thanks!

like image 923
vurquee Avatar asked Nov 19 '25 06:11

vurquee


1 Answers

There are certain functions that are "pluggable", where you can override them, but that is not one of them.

The only way to adjust the core functionality is with action hooks and filters, unless you want to just go in and edit the core directly (bad practice... upgrading the core will overwrite your changes).

If you find a do_action('something'); in the core, you can hook in with add_action('something','my_function');.

If you find an apply_filters('something', $value) in the core, you can filter that $value with add_filter('something', 'my_function');.

By the way, in the above example, you would do:

function my_function($value){
    // manipulate $value
    return $value;
}

Make sure to return something as the filtered value. Unfortunately I can't seem to find anywhere to hook into for this :(.

See http://codex.wordpress.org/Plugin_API for more info.

If you MUST change that text, you could do it after the page loads with javascript.

like image 192
Michael Lewis Avatar answered Nov 21 '25 05:11

Michael Lewis