[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