Пользовательская загрузка Добавляет файл Ghost

Я пробовал это на новой установке на двадцать пятой теме. Я добавляю метабокс на страницы, которые позволяют загружать. Всякий раз, когда я загружаю файл на новую страницу, он загружает файл, а также добавляет другой файл в медиа-библиотеку с именем post_id . Затем он сохраняет фантомный идентификатор в качестве сообщения meta. Если я сначала опубликую сообщение, а затем загрузим файл, все будет работать так, как ожидалось.

Вот мой крюк save_post , приведенный ниже код save_post , без проверки, чтобы воспроизвести проблему.

 /** * Save Metaboxes * @param int $post_id */ function save_custom_meta_boxes( $post_id ) { // If we're not in the right place, bailout if( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || ! isset( $post_id ) || ! isset( $_POST['post_type'] ) || ! current_user_can( 'edit_post', $post_id ) ) { return; } if( isset( $_FILES['_uploaded_file'] ) && ! empty( $_FILES['_uploaded_file']['name'] ) ) { require_once( ABSPATH . 'wp-admin/includes/image.php' ); $uploadStatus = wp_handle_upload( $_FILES['_uploaded_file'], array( 'test_form' => false ) ); $fileID = wp_insert_attachment( array( 'post_mime_type' => $uploadStatus['type'], 'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $uploadStatus['file'] ) ), 'post_content' => '', 'post_status' => 'inherit' ), $uploadStatus['file'], $post_id ); $attachmentData = wp_generate_attachment_metadata( $fileID, $uploadStatus['file'] ); wp_update_attachment_metadata( $fileID, $attachmentData ); update_post_meta( $post_id, '_uploaded_file', $fileID ); } } add_action( 'save_post', 'save_custom_meta_boxes' ); 

Metabox – вот проявление метаболизма.

 /** `page_meta` Callback Function **/ function page_meta_cb( $post ) { wp_nonce_field( 'page_meta_metabox', 'page_meta_nonce' ); $uploaded_file_id = get_post_meta( $post->ID, '_uploaded_file', true ); ?> <table style="width:100%;"> <tbody> <tr id="uploaded_file"> <td style="width:8%;min-width:105px;"> <label for="uploaded_file_input" style="font-weight:bold;">Uploaded File</label><br /> </td> <td> <input type="file" style="width:100%;" name="_uploaded_file" value="" id="uploaded_file_input" /> <?php if( is_numeric( $uploaded_file_id ) ) : ?> <div class="fileLink"> <a href="post.php?post=<?php echo $uploaded_file_id; ?>&action=edit" target="_blank">Edit File - <?php echo get_the_title( $uploaded_file_id ); ?></a> <br /> <br /> </div> <?php endif; ?> </td> </tr> </tbody> </table> <?php } // END Metabox 

Медиа-библиотека выглядит так:

Фантомная загрузка в медиа-библиотеку

Опять же, проблема заключается только в том, что при загрузке на новые должности – опубликованные сообщения не имеют проблем с загрузкой. В чем проблема?

Я немного изменил ваш код, чтобы проверить, что тип сообщения – это страница, которую текущий пользователь может редактировать на этой странице, проверить значение nonce и проверить функции вставки вставки. Полученный код работает. Похоже, что причиной этого может быть не проверка типа сообщения. Кроме того, вам не нужно вручную включать «wp-admin / includes / image.php»:

 add_filter('post_edit_form_tag', function() { echo ' enctype="multipart/form-data"'; }); add_action( 'save_post', 'save_custom_meta_boxes', 10, 2 ); function save_custom_meta_boxes( $post_id, $post ) { // If we're not in the right place, bailout if( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || ! isset( $post_id ) || $post->post_type !== 'page' || ! current_user_can( 'edit_page', $post_id ) ) { return; } if ( !isset( $_POST['page_meta_nonce'] ) || ! wp_verify_nonce( $_POST['page_meta_nonce'], 'page_meta_metabox' ) ) { return; } if( ! empty( $_FILES['_uploaded_file']['name'] ) ) { $uploadStatus = wp_handle_upload( $_FILES['_uploaded_file'], array( 'test_form' => false ) ); if ( $uploadStatus && ! isset( $uploadStatus['error'] ) ) { $fileID = wp_insert_attachment( array( 'post_mime_type' => $uploadStatus['type'], 'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $uploadStatus['file'] ) ), 'post_content' => '', 'post_status' => 'inherit' ), $uploadStatus['file'], $post_id ); if( $fileID ) { $attachmentData = wp_generate_attachment_metadata( $fileID, $uploadStatus['file'] ); wp_update_attachment_metadata( $fileID, $attachmentData ); update_post_meta( $post_id, '_uploaded_file', $fileID ); } } } } add_action( 'add_meta_boxes_page', 'page_meta' ); function page_meta() { add_meta_box("page_upload_image", 'Upload image', 'page_meta_cb'); } /** `page_meta` Callback Function **/ function page_meta_cb( $post ) { wp_nonce_field( 'page_meta_metabox', 'page_meta_nonce' ); $uploaded_file_id = get_post_meta( $post->ID, '_uploaded_file', true ); ?> <div> <table style="width:100%;"> <tbody> <tr id="uploaded_file"> <td style="width:8%;min-width:105px;"> <label for="uploaded_file_input" style="font-weight:bold;">Uploaded File</label><br /> </td> <td> <input type="file" style="width:100%;" name="_uploaded_file" value="" id="uploaded_file_input" /> <?php if( is_numeric( $uploaded_file_id ) ) : ?> <div class="fileLink"> <a href="post.php?post=<?php echo $uploaded_file_id; ?>&action=edit" target="_blank">Edit File - <?php echo get_the_title( $uploaded_file_id ); ?></a> <br /> <br /> </div> <?php endif; ?> </td> </tr> </tbody> </table> </div> <?php } // END Metabox 

Частью вашей проблемы может быть то, что, создав nonce, вы действительно не используете его.

Вам не нужно, чтобы это было nonce, скрытый ввод текста был бы таким же хорошим (да, codex снова не прав;)). Вы используете скрытый ввод в качестве индикатора, когда сохранение произошло с экрана редактирования сообщения или технически, когда мета-окно было отображено как часть формы. Это должно защитить вас, когда пользователь делает массовое редактирование, и я предполагаю, что, поскольку ревизии не сохраняют метазначения, они должны защищать вас от конкретной проблемы.