bp_attachments_cover_image_ajax_upload()
Ajax Upload and set a cover photo
Description
Return
(string|null) A json object containing success data if the upload succeeded, error message otherwise.
Source
File: bp-core/bp-core-attachments.php
function bp_attachments_cover_image_ajax_upload() {
if ( ! bp_is_post_request() ) {
wp_die();
}
check_admin_referer( 'bp-uploader' );
// Sending the json response will be different if the current Plupload runtime is html4.
$is_html4 = ! empty( $_POST['html4' ] );
if ( empty( $_POST['bp_params'] ) ) {
bp_attachments_json_response( false, $is_html4 );
}
$bp_params = bp_parse_args( $_POST['bp_params'], array(
'object' => 'user',
'item_id' => bp_loggedin_user_id(),
), 'attachments_cover_image_ajax_upload' );
$bp_params['item_id'] = (int) $bp_params['item_id'];
$bp_params['object'] = sanitize_text_field( $bp_params['object'] );
// We need the object to set the uploads dir filter.
if ( empty( $bp_params['object'] ) ) {
bp_attachments_json_response( false, $is_html4 );
}
// Capability check.
if ( ! bp_attachments_current_user_can( 'edit_cover_image', $bp_params ) ) {
bp_attachments_json_response( false, $is_html4 );
}
$bp = buddypress();
$needs_reset = array();
// Member's cover photo.
if ( 'user' === $bp_params['object'] ) {
$object_data = array( 'dir' => 'members', 'component' => 'xprofile' );
if ( ! bp_displayed_user_id() && ! empty( $bp_params['item_id'] ) ) {
$needs_reset = array( 'key' => 'displayed_user', 'value' => $bp->displayed_user );
$bp->displayed_user->id = $bp_params['item_id'];
}
// Group's cover photo.
} elseif ( 'group' === $bp_params['object'] ) {
$object_data = array( 'dir' => 'groups', 'component' => 'groups' );
if ( ! bp_get_current_group_id() && ! empty( $bp_params['item_id'] ) ) {
$needs_reset = array( 'component' => 'groups', 'key' => 'current_group', 'value' => $bp->groups->current_group );
$bp->groups->current_group = groups_get_group( $bp_params['item_id'] );
}
// Other object's cover photo.
} else {
$object_data = apply_filters( 'bp_attachments_cover_image_object_dir', array(), $bp_params['object'] );
}
// Stop here in case of a missing parameter for the object.
if ( empty( $object_data['dir'] ) || empty( $object_data['component'] ) ) {
bp_attachments_json_response( false, $is_html4 );
}
/**
* Filters whether or not to handle cover photo uploading.
*
* If you want to override this function, make sure you return an array with the 'result' key set.
*
* @since BuddyPress 2.5.1
*
* @param array $value
* @param array $bp_params
* @param array $needs_reset Stores original value of certain globals we need to revert to later.
* @param array $object_data
*/
$pre_filter = apply_filters( 'bp_attachments_pre_cover_image_ajax_upload', array(), $bp_params, $needs_reset, $object_data );
if ( isset( $pre_filter['result'] ) ) {
bp_attachments_json_response( $pre_filter['result'], $is_html4, $pre_filter );
}
$cover_image_attachment = new BP_Attachment_Cover_Image();
$uploaded = $cover_image_attachment->upload( $_FILES );
// Reset objects.
if ( ! empty( $needs_reset ) ) {
if ( ! empty( $needs_reset['component'] ) ) {
$bp->{$needs_reset['component']}->{$needs_reset['key']} = $needs_reset['value'];
} else {
$bp->{$needs_reset['key']} = $needs_reset['value'];
}
}
if ( ! empty( $uploaded['error'] ) ) {
// Upload error response.
bp_attachments_json_response( false, $is_html4, array(
'type' => 'upload_error',
'message' => sprintf( __( 'Upload Error: %s', 'buddyboss' ), $uploaded['error'] ),
) );
}
$error_message = __( 'There was a problem uploading the cover photo.', 'buddyboss' );
$bp_attachments_uploads_dir = bp_attachments_cover_image_upload_dir();
// The BP Attachments Uploads Dir is not set, stop.
if ( ! $bp_attachments_uploads_dir ) {
bp_attachments_json_response( false, $is_html4, array(
'type' => 'upload_error',
'message' => $error_message,
) );
}
$cover_subdir = $object_data['dir'] . '/' . $bp_params['item_id'] . '/cover-image';
$cover_dir = trailingslashit( $bp_attachments_uploads_dir['basedir'] ) . $cover_subdir;
if ( 1 === validate_file( $cover_dir ) || ! is_dir( $cover_dir ) ) {
// Upload error response.
bp_attachments_json_response( false, $is_html4, array(
'type' => 'upload_error',
'message' => $error_message,
) );
}
/*
* Generate the cover photo so that it fit to feature's dimensions
*
* Unlike the avatar, uploading and generating the cover photo is happening during
* the same Ajax request, as we already instantiated the BP_Attachment_Cover_Image
* class, let's use it.
*/
$cover = bp_attachments_cover_image_generate_file( array(
'file' => $uploaded['file'],
'component' => $object_data['component'],
'cover_image_dir' => $cover_dir
), $cover_image_attachment );
if ( ! $cover ) {
bp_attachments_json_response( false, $is_html4, array(
'type' => 'upload_error',
'message' => $error_message,
) );
}
$cover_url = trailingslashit( $bp_attachments_uploads_dir['baseurl'] ) . $cover_subdir . '/' . $cover['cover_basename'];
// 1 is success.
$feedback_code = 1;
// 0 is the size warning.
if ( $cover['is_too_small'] ) {
$feedback_code = 0;
}
// Set the name of the file.
$name = $_FILES['file']['name'];
$name_parts = pathinfo( $name );
$name = trim( substr( $name, 0, - ( 1 + strlen( $name_parts['extension'] ) ) ) );
/**
* Fires if the new cover photo was successfully uploaded.
*
* The dynamic portion of the hook will be xprofile in case of a user's
* cover photo, groups in case of a group's cover photo. For instance:
* Use add_action( 'xprofile_cover_image_uploaded' ) to run your specific
* code once the user has set his cover photo.
*
* @since BuddyPress 2.4.0
* @since BuddyPress 3.0.0 Added $cover_url, $name, $feedback_code arguments.
*
* @param int $item_id Inform about the item id the cover photo was set for.
* @param string $name Filename.
* @param string $cover_url URL to the image.
* @param int $feedback_code If value not 1, an error occured.
*/
do_action(
$object_data['component'] . '_cover_image_uploaded',
(int) $bp_params['item_id'],
$name,
$cover_url,
$feedback_code
);
// Finally return the cover photo url to the UI.
bp_attachments_json_response( true, $is_html4, array(
'name' => $name,
'url' => $cover_url,
'feedback_code' => $feedback_code,
) );
}
Changelog
| Version | Description |
|---|---|
| BuddyPress 2.4.0 | Introduced. |
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.