AnsPress_Uploader()
Description #
AnsPress upload hooks.
Source #
File: includes/upload.php
class AnsPress_Uploader {
/**
* Delete question or answer attachment.
*/
public static function delete_attachment() {
$attachment_id = ap_sanitize_unslash( 'attachment_id', 'r' );
if ( ! anspress_verify_nonce( 'delete-attachment-' . $attachment_id ) ) {
ap_ajax_json( 'no_permission' );
}
// If user cannot delete then die.
if ( ! ap_user_can_delete_attachment( $attachment_id ) ) {
ap_ajax_json( 'no_permission' );
}
$attach = get_post( $attachment_id );
$row = wp_delete_attachment( $attachment_id, true );
if ( false !== $row ) {
ap_update_post_attach_ids( $attach->post_parent );
ap_ajax_json( array( 'success' => true ) );
}
ap_ajax_json(
array(
'success' => false,
'snackbar' => array( 'message' => __( 'Unable to delete attachment', 'anspress-question-answer' ) ),
)
);
}
/**
* Update users temporary attachment count before a attachment deleted.
*
* @param integer $post_id Post ID.
*/
public static function deleted_attachment( $post_id ) {
$_post = get_post( $post_id );
if ( 'attachment' === $_post->post_type ) {
ap_update_user_temp_media_count();
ap_update_post_attach_ids( $_post->post_parent );
}
}
/**
* Schedule event twice daily.
*/
public static function create_single_schedule() {
// Check if event scheduled before.
if ( ! wp_next_scheduled( 'ap_delete_temp_attachments' ) ) {
// Shedule event to run every day.
wp_schedule_event( time(), 'twicedaily', 'ap_delete_temp_attachments' );
}
}
/**
* Delete temporary media which are older then today.
*
* @since 4.1.8 Delete files from temporary directory as we well.
*/
public static function cron_delete_temp_attachments() {
global $wpdb;
$posts = $wpdb->get_results( "SELECT ID, post_author, post_parent FROM $wpdb->posts WHERE post_type = 'attachment' AND post_title='_ap_temp_media' AND post_date <= CURDATE()" ); // phpcs:ignore WordPress.DB
$authors = array();
if ( $posts ) {
foreach ( (array) $posts as $_post ) {
wp_delete_attachment( $_post->ID, true );
ap_update_post_attach_ids( $_post->post_parent );
$authors[] = $_post->post_author;
}
// Update temporary attachment counts of a user.
foreach ( (array) array_unique( $authors ) as $author ) {
ap_update_user_temp_media_count( $author );
}
}
// Delete all temporary files.
$uploads = wp_upload_dir();
$files = glob( $uploads['basedir'] . '/anspress-temp/*' );
$interval = strtotime( '-2 hours' );
// Make sure WP_Filesystem is loaded.
if ( ! function_exists( 'WP_Filesystem' ) ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
}
// Initialize WP_Filesystem.
if ( ! \WP_Filesystem() ) {
// Unable to initialize WP_Filesystem, handle error accordingly.
return;
}
global $wp_filesystem;
if ( $files ) {
foreach ( $files as $file ) {
if ( filemtime( $file ) <= $interval ) {
$wp_filesystem->delete( $file );
}
}
}
}
/**
* Ajax callback for image upload form.
*
* @return void
* @since 4.1.8
*/
public static function upload_modal() {
// Check nonce.
if ( ! anspress_verify_nonce( 'ap_upload_image' ) ) {
ap_ajax_json( 'something_wrong' );
}
// Check if user have permission to upload tem image.
if ( ! ap_user_can_upload() ) {
ap_send_json(
array(
'success' => false,
'snackbar' => array(
'message' => __( 'Sorry! you do not have permission to upload image.', 'anspress-question-answer' ),
),
)
);
}
$image_for = ap_sanitize_unslash( 'image_for', 'r' );
ob_start();
anspress()->get_form( 'image_upload' )->generate(
array(
'hidden_fields' => array(
array(
'name' => 'action',
'value' => 'ap_image_upload',
),
array(
'name' => 'image_for',
'value' => $image_for,
),
),
)
);
$html = ob_get_clean();
ap_send_json(
array(
'success' => true,
'action' => 'ap_upload_modal',
'html' => $html,
'title' => __( 'Select media file to upload', 'anspress-question-answer' ),
)
);
}
/**
* Ajax callback for `ap_image_upload`. Process `image_upload` form.
*
* @return void
* @since 4.1.8
* @since 4.1.13 Pass a `image_for` in JSON so that javascript callback can be triggered.
*/
public static function image_upload() {
$form = anspress()->get_form( 'image_upload' );
// Check if user have permission to upload tem image.
if ( ! ap_user_can_upload() ) {
ap_send_json(
array(
'success' => false,
'snackbar' => array(
'message' => __( 'Sorry! you do not have permission to upload image.', 'anspress-question-answer' ),
),
)
);
}
// Nonce check.
if ( ! $form->is_submitted() ) {
ap_ajax_json( 'something_wrong' );
}
$image_for = ap_sanitize_unslash( 'image_for', 'r' );
$values = $form->get_values();
// Check for errors.
if ( $form->have_errors() ) {
ap_send_json(
array(
'success' => false,
'snackbar' => array(
'message' => __( 'Unable to upload image(s). Please check errors.', 'anspress-question-answer' ),
),
'form_errors' => $form->errors,
'fields_errors' => $form->get_fields_errors(),
)
);
}
$field = $form->find( 'image' );
// Call save.
$files = $field->save_cb();
$new_arr = array();
// Add a property to check if image or not.
if ( ! empty( $files ) ) {
$all_possible_images_ext = array( 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp' );
foreach ( $files as $file_basename => $file_url ) {
// Get file extension from file name.
$ext = pathinfo( $file_basename, PATHINFO_EXTENSION );
$new_arr[ $file_basename ] = array(
'ext' => $ext,
'filename' => $file_basename,
'is_image' => in_array( $ext, $all_possible_images_ext, true ),
'url' => $file_url,
);
}
$files = $new_arr;
}
$res = array(
'success' => true,
'action' => 'ap_image_upload',
'image_for' => $image_for,
'snackbar' => array( 'message' => __( 'Successfully uploaded image', 'anspress-question-answer' ) ),
'files' => $files,
);
// Send response.
if ( is_array( $res ) ) {
ap_send_json( $res );
}
ap_ajax_json( 'something_wrong' );
}
/**
* Callback for hook `intermediate_image_sizes_advanced`.
*
* @param array $sizes Image sizes.
* @return array
*/
public static function image_sizes_advanced( $sizes ) {
global $ap_thumbnail_only;
if ( true === $ap_thumbnail_only ) {
return array(
'thumbnail' => array(
'width' => 150,
'height' => 150,
'crop' => true,
),
);
}
return $sizes;
}
}
Expand full source code Collapse full source code View on GitHub: includes/upload.php:22
Add your comment