категория изображение таксономия

Вопрос или проблема

Я использовал это решение для моей проблемы: создание таксономии для изображений без использования плагинов, найдено здесь:
Как добавить поле загрузки в пользовательскую таксономию?

Вот код, который я использую:

    function edit_form_tag( ) {
    echo ' enctype="multipart/form-data"';
}
add_action( 'category_term_edit_form_tag' , 'edit_form_tag' );
add_action( 'tax_projects_term_edit_form_tag' , 'edit_form_tag' );

add_action( 'tax_projects_term_edit_form_tag' , 'edit_form_tag' );

/** Добавить новое поле в категорию **/
function additional_category_fields( $term, $tax ) {
    $uploadID   = get_option( "{$tax}_image_{$term->term_id}" );            // Получаем ID вложения из таблицы опций
    $feedback   = get_option( "{$tax}_image_{$term->term_id}_feedback" );   // Получаем любой отклик по загрузке из таблицы опций
?>
    <tr class="form-field">
        <th scope="row" valign="top"><label for="meta-order"><?php _e( 'Изображение категории' ); ?></label></th>
        <td>
            <div id="catImage">

                <!-- Создать nonce для проверки -->
                <input type="hidden" name="upload_meta_nonce" value="<?php echo wp_create_nonce( basename( __FILE__ ) ); ?>" />

                <!-- Определяем поле для загрузки -->
                Пожалуйста, выберите изображение: <input type="file" name="_uploaded_file" value="" />

                <?php 
                  if( is_numeric( $uploadID ) ) :                                       // Если наш ID загрузки действительно числовой, продолжаем

                    /***
                    /*  В этом случае мы получаем изображение, если бы мы загружали
                    /*  что-то вроде PDF, мы могли бы использовать встроенную функцию
                    /*  wp_get_attachment_url( $id );
                    /*  codex.wordpress.org/Function_Reference/wp_get_attachment_url
                    ***/
                    $imageArr = wp_get_attachment_image_src( $uploadID, 'medium' );     // Получаем URL изображения среднего размера
                    $imageURL = $imageArr[0];                                           // wp_get_attachment_image_src() возвращает массив, индекс 0 — наш URL
                ?>

                    <div id="uploaded_image">
                        <a href="https://wordpress.stackexchange.com/questions/204961/post.php?post=<?php echo $uploadID; ?>&action=edit" target="_blank">Редактировать изображение</a><br />

                        <!-- Отображаем изображение с использованием ранее полученного URL -->
                        <a href="https://wordpress.stackexchange.com/questions/204961/post.php?post=<?php echo $uploadID; ?>&action=edit" target="_blank"><img src="<?php echo $imageURL; ?>" /></a><br /><br />
                    </div>

                <!-- Если мы получили отклик, значит что-то пошло не так, и нам нужно его показать. -->               
                <?php elseif( ! empty( $feedback ) ) : ?>

                    <p style="color:red;font-size:12px;font-weight;bold;font-style:italic;"><?php echo $feedback; ?></p>

                <?php endif; ?>

            </div>
            <span class="description"><?php _e( 'Загрузите подходящее изображение.' ); ?></span>
                <br />
                <br />

            <!-- Эта ссылка для нашего процесса удаления -->
            <?php if( ! empty( $uploadID ) ) : ?>

                <a href="https://wordpress.stackexchange.com/questions/204961/javascript:void(0)" class="deleteImage" style="color:red;text-decoration:underline;">Удалить</a>

            <?php endif; ?>

        </td> 
    </tr>
<?php
    /** Поскольку мы показали пользователю нужный отклик, мы можем удалить нашу опцию **/
    delete_option( "{$tax}_image_{$term->term_id}_feedback" );
}
add_action( 'category_edit_form_fields', 'additional_category_fields', 10, 2 ); 

/** Сохранить метаданные категории **/
function save_category_fields( $term_id ) {

    // Убедитесь, что nonce установлен, таксономия установлена, и что загруженный файл не пуст
    if(
      isset( $_POST['upload_meta_nonce'] ) && wp_verify_nonce( $_POST['upload_meta_nonce'], basename( __FILE__ ) ) &&
      isset( $_POST['taxonomy'] ) && isset( $_FILES['_uploaded_file'] ) && !empty( $_FILES['_uploaded_file'] )
    ) {
        $tax            = $_POST['taxonomy'];                                                   // Сохраняем таксономию, используемую для именования опции
        $supportedTypes = array( 'image/gif', 'image/jpeg', 'image/png' );                      // Принимаем только изображения. - Список типов: http://ru.wikipedia.org/wiki/Internet_media_type
        $fileArray      = wp_check_filetype( basename( $_FILES['_uploaded_file']['name'] ) );   // Получаем mime-тип и расширение.
        $fileType       = $fileArray['type'];                                                   // Сохраняем тип файла

        // Проверяем, соответствует ли тип ожидаемому
        if( in_array( $fileType, $supportedTypes ) ) {
            $uploadStatus = wp_handle_upload( $_FILES['_uploaded_file'], array( 'test_form' => false ) );   // Позволяем WordPress обрабатывать загрузку

            // Убедитесь, что файл был загружен без ошибок
            if( isset( $uploadStatus['file'] ) ) {
                require_once(ABSPATH . "wp-admin" . '/includes/image.php');

                // Добавляем изображение в медиабиблиотеку, чтобы получить доступ к метаданным
                $imageID = wp_insert_attachment( array(
                        'post_mime_type'    => $uploadStatus['type'],
                        'post_title'        => preg_replace( '/\.[^.]+$/', '', basename( $uploadStatus['file'] ) ),
                        'post_content'      => '',
                        'post_status'       => 'publish'
                    ),
                    $uploadStatus['file']
                );

                // Генерируем метаданные вложения, затем обновляем файл.
                $attachmentData = wp_generate_attachment_metadata( $imageID, $uploadStatus['file'] );
                wp_update_attachment_metadata( $imageID,  $attachmentData );

                $existingImage = get_option( "{$tax}_image_{$term_id}" );               // Если файл уже существует в этой опции, захватите его
                if( ! empty( $existingImage ) && is_numeric( $existingImage ) ) {       // Если опция существует, удалите ее.
                    wp_delete_attachment( $existingImage );
                }

                update_option( "{$tax}_image_{$term_id}", $imageID );                   // Обновляем опцию с новым ID вложения
                delete_option( "{$tax}_image_{$term_id}_feedback" );                    // На всякий случай удаляем опцию отклика - теоретически она не должна существовать на этом этапе.
            }
            else {
                $uploadFeedback = 'Проблема с вашим загруженным файлом. Свяжитесь с администратором.';    // Что-то серьезное пошло не так, включите отладку
            }
        }
        else {
            $uploadFeedback = 'Только изображения: JPEG/JPG, GIF, PNG';   // Неверный тип файла
        }

        // Обновляем нашу опцию отклика
        if( isset( $uploadFeedback ) ) {
            update_option( "{$tax}_image_{$term_id}_feedback", $uploadFeedback );
        }
    }
}
add_action ( 'edited_category', 'save_category_fields');

Мой вопрос прост: я новичок в PHP и хочу узнать, как вывести это значение. Я пробовал так:

<?php
$image_of = get_option('category_image_1');
echo $image_of;
?>

Я использую “get_option(‘category_image_1’)”, как сказано в шаге 3 выше по ссылке, но понятия не имею, что нужно поставить перед echo .. какие-нибудь предложения?

Спасибо!
Ноэми

Нашел решение:

<?php 
    $cat = get_the_category();
    $category_id = $cat[0]->term_id;

                foreach (get_the_category() as $cat) :

                $attachmentId = get_option("category_image_{$category_id}", 'null');
                $imageArr = wp_get_attachment_image_src( $attachmentId, 'medium' );     
                $imageURL = $imageArr[0];                                           
                echo '<img src="' .  $imageURL . '" />';

                endforeach; ?>

Чтобы показать изображение, попробуйте связать его с категорией с ID термина 1, вы должны получить URL вложения изображения, используя ID вложения, хранящийся в опции. Вы можете сделать это, используя функцию wp_get_attachment_url()

<?php
// Получаем ID вложения, хранящийся в опции
$image_id = get_option('category_image_1');

// Проверяем, действителен ли ID вложения
if ($image_id) {
    // Получаем URL вложения
    $image_url = wp_get_attachment_url($image_id);

    // Выводим HTML изображения
    echo '<img src="' . esc_url($image_url) . '" alt="Category Image">';
} else {
    // Выводим сообщение, если изображение не связано с категорией
    echo 'Изображение не найдено для этой категории.';
}
?>

.

Ответ или решение

Вопрос о категории и таксономии изображений в WordPress

Ваша задача создать таксономию для изображений в WordPress без использования плагинов. Бывший в употреблении подход заключался в добавлении поля загрузки в пользовательскую таксономию и обработке изображений с помощью механизма wp_handle_upload. Основная идея состояла в том, чтобы позволить пользователям загружать изображения для категорий через администраторскую панель, а затем привязывать эти изображения к конкретным категориям для дальнейшего использования.

Ваш код

Вы привели код, который добавляет возможность загружать изображения для определенных таксономий прямо из панели администрирования WordPress. Давайте разберем ключевые части этого кода:

  1. Функция edit_form_tag — добавляет enctype для поддержки загрузки файлов в форму редактирования категорий.

  2. additional_category_fields — добавляет дополнительные поля для загрузки изображений в форме редактирования терминов:

    • Создается nonce для валидации безопасности.
    • Проверяется наличие ранее загруженных изображений и отображается их предпросмотр.
    • Обрабатываются сообщения об ошибках, если они были.
  3. save_category_fields — управляет загрузкой файла, проверяет его тип, и, если тип корректен, загружает изображение в медиатеку WordPress, создавая при этом метаданные и обновляя опцию с новым идентификатором вложения.

Как отображать изображение для категории

Вы также привели несколько методов для вывода изображений категорий на сайт. Основная проблема, с которой вы столкнулись, заключалась в том, чтобы корректно получать URL изображения и выводить его на страницу. Решение использует идентификатор вложения, хранящийся в настройках, и функцию wp_get_attachment_url, чтобы получить полный URL изображения.

<?php
// Получаем ID вложения, связанный с категорией
$image_id = get_option('category_image_1');

// Проверяем, если ID вложения валиден
if ($image_id) {
    // Получаем URL вложения
    $image_url = wp_get_attachment_url($image_id);

    // Выводим HTML-код изображения
    echo '<img src="' . esc_url($image_url) . '" alt="Category Image">';
} else {
    // Выводим сообщение, если изображение для категории не назначено
    echo 'No image found for this category.';
}
?>

Профессиональный подход к решению

Используемый вами код обладает следующими качествами:

  • Безопасность: Отслеживается использование nonce для валидации форм, что защищает от атак CSRF.
  • Удобство администрирования: Позволяет администраторам легко управлять изображениями категорий без необходимости в установке дополнительных плагинов.
  • Производительность: Загруженные изображения хранятся в медиатеке WordPress, что упрощает управление данными благодаря единообразию с уже существующими средствами.

Пользовательский опыт и SEO

Важно подчеркнуть, что изображения, привязанные к категориям, могут улучшить UX и SEO вашего сайта. Благодаря визуальному сопровождению категорий пользователи могут быстрее находить интересующий их контент. Добавление тега alt к изображениям, как это сделано в вашем примере, также улучшает доступность и поисковую оптимизацию сайта.

Для улучшения вашего проекта, вы можете рассмотреть внедрение кеширования изображений и использование ключевых слов для улучшения SEO текстов, сопровождающих изображения категорий.

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

Оцените материал
Добавить комментарий

Капча загружается...