[wp-hackers] Problem with admin AJAX not executing plugin code

Jake McMurchie jake.mcmurchie at googlemail.com
Mon Apr 4 14:57:24 UTC 2011


Hello all.

I'm having a problem whereby the AJAX managing comments in the admin
area is preventing my plugin code from running.

To complement the 'Easy Comment Uploads' plugin (thanks to Tom Wright)
I'm writing a plugin that will convert an uploaded file (notionally
attached to a comment) to a post attachment when the comment is
approved (and will remove it when the comment is unapproved, trashed,
etc.)

Briefly my plugin should work as follows:
- the ECU plugin uploads files to a wp-content/uploads/comments folder

- when 'approve' clicked:
    - the file is copied to the wp-content/uploads/ folder
    - converted to a post with post_type=attachment, thumbnails
created (using wp_insert_attachment etc.)
    - comment meta created to link comment to new post attachment

- when 'unapproved/spam/trash' clicked:
    - post attachment deleted, thumbnails etc deleted, copy of the
file in /uploads/ is deleted (using wp_delete_attachment)

My code works fine if I disable javascript on the admin
edit-comments.php, but doesn't if javascript is on (the default).

Any help or suggestions much appreciated. Code appended below. Thanks.

Jake

add_action( 'admin_menu', 'jm_comment_attachment_convertor' );

function jm_comment_attachment_convertor() {
	add_action( 'wp_set_comment_status', 'jm_attach_file', 10, 2 );
}

function jm_attach_file( $comment_id, $comment_status ) {
	
	// get comment info (associated page and content of comment)
	$comment = get_comment( $comment_id );
	$postid = $comment->comment_post_ID;
	$content = $comment->comment_content;

	// find upload directory and comment uploads directory
	$upldir = wp_upload_dir();
	$upldir = $upldir[ 'path' ].'/';
	$commupldir = $upldir.'comments/';
		
	// find out if comment upload previously converted to attachment
	$attachment_array = get_comment_meta( $comment_id, "comment_attachment_id" );
	if ($attachment_array)
		$attachment_id = $attachment_array[0];

	// if upload not yet converted, check for uploaded image
	if ( !$attachment_id ) {

		$imgo = strpos( $content, '[img]' );
		$imgc = strpos( $content, '[/img]' );
		if ( $imgo!==false && $imgc && $imgo<$imgc ) {

			// if img url complete and right way round
			$imgurl = substr( $content, $imgo+5, $imgc-5-$imgo );

			// get image filename
			$imgpath = pathinfo( $imgurl );
			$imgpath = $imgpath[ 'basename' ];
			// get path of image
			$imgpath = $commupldir . $imgpath;

			// get path of uploads directory to get path of image
			if ( file_exists( $imgpath )) {
				$img = $imgpath;
				$imgname = basename( $img );
			}
		}
	}

	// APPROVE NEW COMMENT AND CONVERT UPLOAD TO ATTACHMENT

	if ( $img && !$attachment_id && "approve"==$comment_status ) {
		
		// copy file to the main uploads folder
		if ( copy( $img, $upldir . $imgname ))
			$approvedimg = $upldir . $imgname;
		
		// if we have an image and want to approve it
		$wp_filetype = wp_check_filetype( $imgname, null );
		$attachment = array(
		   'post_mime_type' => $wp_filetype[ 'type' ],
		   'post_title' => preg_replace('/\.[^.]+$/', '', $imgname),
		   'post_content' => '',
		   'post_status' => 'inherit'
		);
		$attach_id = wp_insert_attachment( $attachment, $approvedimg, $postid );
		
		// include the image.php file to create thumbnails etc.
		// for the function wp_generate_attachment_metadata() to work
		require_once(ABSPATH . "wp-admin" . '/includes/image.php');
		$attach_data = wp_generate_attachment_metadata( $attach_id, $approvedimg );
		wp_update_attachment_metadata( $attach_id,  $attach_data );
			
		// make a note of the attachment id against the comment so we can
delete the attachment if the comment is unapproved
		add_comment_meta( $comment_id, "comment_attachment_id", $attach_id );
	}
	
	// UNAPPROVE APPROVED COMMENT (DELETE ATTACHMENT BUT NOT ORIGINAL FILE)
	
	else if ( $attachment_id && ( "hold"==$comment_status ||
"spam"==$comment_status || "trash"==$comment_status )) {

		// delete the attachment
		wp_delete_attachment( $attachment_id, $force_delete = false );

		// delete the comment meta linking to this attachment
		delete_comment_meta( $comment_id, "comment_attachment_id" );
	}

	// DELETE NEW/UNAPPROVED/SPAMMED/TRASHED COMMENT AND DELETE ORIGINAL FILE

	else if ( $img && !$attachment_id && "delete"==$comment_status ) {
		// ACTION 'wp_set_comment_status' NOT CALLED WHEN PERMANENT
DELETE??? looks like it in wp-includes/comment.php
		// move the file to the deleted directory
		rename( $img, $deleteddir . $imgname );
	}
}


More information about the wp-hackers mailing list