Не загружается, отправленное с помощью <input type="file" ... />, изображение в плагине Wordpress

Рейтинг: 0Ответов: 0Опубликовано: 03.06.2023

Столкнулся с одной проблемой во время создания собственного плагина для Wordpress. Для начала дам код страницы admin.php:

<?php
// create custom plugin settings menu
// add_action('admin_menu', 'kc_create_menu');
function kc_create_menu()
{
    //create new top-level menu
    add_menu_page('Dan Slider Plugin Settings', 'Dan Slider', 'administrator', __FILE__, 'kc_settings_page', plugins_url('/images/icon.png', __FILE__));
    //call register settings function
    add_action('admin_init', 'register_mysettings');
}
function register_mysettings()
{
    //register our settings
    register_setting('kc-settings-group', 'kc_post_type');
    register_setting('kc-settings-group', 'kc_category_name');
    register_setting('kc-settings-group', 'kc_custom_img');
    register_setting('kc-settings-group', 'kc_bg_color');
    register_setting('kc-settings-group', 'my_file_upload');
    register_setting('kc-settings-group', 'kc_background_type');
    register_setting('kc-settings-group', 'kc_text_color');
    register_setting('kc-settings-group', 'kc_tag');
    register_setting('kc-settings-group', 'kc_count');
}
function kc_settings_page()
{
    $kc_post_types = get_post_types(['public' => true]);
    unset($kc_post_types['attachment']);
    $kc_categories = get_categories([
        'taxonomy' => 'category'
    ]);
    // $kc_categories = get_categories();
    // $kc_categories["empty"]["name"] = "";

    function kc_file_upload()
    {
        if (!empty($_FILES["my_file_upload"])) {

            if (!function_exists('wp_handle_upload'))
                require_once(ABSPATH . 'wp-admin/includes/file.php');

            $file = &$_FILES['my_file_upload'];

            $overrides = ['test_form' => false];

            $movefile = wp_handle_upload($file, $overrides);

            if ($movefile && empty($movefile['error'])) {
                echo "Файл был успешно загружен.\n";
                print_r($movefile);
            } else {
                echo "Возможны атаки при загрузке файла!\n";
            }
        }
    }
?>
    <div class="wrap">
        <h2>Dan slider</h2>
        <form enctype="multipart/form-data" method="post" action="options.php">
            <?php settings_fields('kc-settings-group'); ?>
            <table class="form-table">
                <tr valign="top">
                    <th scope="row">Post Type</th>
                    <td>
                        <select name="kc_post_type" id="kc_post_type">
                            <?php foreach ($kc_post_types as $kc_post_type) {
                                echo '<option value="' . $kc_post_type . '" ' . selected(get_option('kc_post_type'), $kc_post_type) . '>' . $kc_post_type . '</option>';
                            }
                            ?>
                        </select>

                    </td>
                </tr>
                <tr valign="top">
                    <th scope="row">Category Name</th>
                    <td>
                        <select name="kc_category_name" id="kc_category_name">
                            <?php
                            foreach ($kc_categories as $kc_category) {
                                echo '<option value="' . $kc_category->name . '" ' . selected(get_option('kc_category_name'), $kc_category->name) . '>' . ($kc_category->name ? $kc_category->name : "none") . '</option>';
                            }
                            ?>
                        </select>

                    </td>
                </tr>
                <tr valign="top">
                    <th scope="row">Background type</th>
                    <td>
                        <select name="kc_background_type" id="kc_background_type">
                            <?php
                            echo '<option value="post_image" ' . selected(get_option('kc_background_type'), 'post_image') . '>Post image</option>';
                            echo '<option value="custom_image" ' . selected(get_option('kc_background_type'), 'custom_image') . '>Custom image</option>';
                            echo '<option value="custom_color" ' . selected(get_option('kc_background_type'), 'custom_color') . '>Custom color</option>';
                            ?>
                        </select>

                    </td>
                </tr>
                <script>
                    jQuery(document).ready(function($) {
                        $('#kc_background_type').change(function() {
                            const option_val = $(this).val();
                            // const options_arr = ['#custom_color'];
                            const options_arr = ['#custom_image', '#custom_color'];
                            $.each(options_arr, function(index, value) {
                                $(value).hide();
                            });
                            if (option_val === 'custom_image') $('#custom_image').show();
                            if (option_val === 'custom_color') $('#custom_color').show();
                        });
                    });
                </script>
                <tr id="custom_color" style="display:none;" valign="top">
                    <th scope="row">Background color</th>
                    <td><input type="color" name="kc_bg_color" value="<?php echo get_option('kc_bg_color'); ?>" /></td>
                </tr>
                <tr valign="top">
                    <th scope="row">Text color</th>
                    <td><input type="color" name="kc_text_color" value="<?php echo get_option('kc_text_color'); ?>" /></td>
                </tr>
                <tr valign="top">
                    <th scope="row">Tags</th>
                    <td><input type="text" name="kc_tag" value="<?php echo get_option('kc_tag'); ?>" /></td>
                </tr>
                <tr valign="top">
                    <th scope="row">Count</th>
                    <td><input type="number" name="kc_count" value="<?php echo get_option('kc_count'); ?>" min="1" max="12" /></td>
                </tr>
            </table>

            <input name="my_file_upload" type="file" />

            <p class="submit">
                <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
            </p>
        </form>
    </div>
<?php
}
?>

Проблема заключается в том, что при попытке загрузить изображение с помощью <input name="my_file_upload" type="file" /> изображение не загружается в корневую папку Wordpress /uploads/. Я несколько часов искал, в чём проблема. В итоге не нашёл, но заметил одну закономерность: когда я в <form enctype="multipart/form-data" method="post" action="options.php"> заменяю options.php в атрибуте action, <input name="my_file_upload" type="file" /> начинает работать, то есть всё загружается в папку /uploads/, но перестают работать остальные <input/> из этой формы. Когда назад возвращаю options.php в атрибут action, происходит обратное - <input name="my_file_upload" type="file" /> перестаёт работать, а остальные <input/> начинают работать нормально. Я чувствую, что ошибка моя очень глупая, но я пока новичок в теме создания плагинов. Буду рад помощи

Ответы

Ответов пока нет.