Вопрос или проблема
Я использовал это решение для моей проблемы: создание таксономии для изображений без использования плагинов, найдено здесь:
Как добавить поле загрузки в пользовательскую таксономию?
Вот код, который я использую:
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. Давайте разберем ключевые части этого кода:
-
Функция
edit_form_tag
— добавляет enctype для поддержки загрузки файлов в форму редактирования категорий. -
additional_category_fields
— добавляет дополнительные поля для загрузки изображений в форме редактирования терминов:- Создается nonce для валидации безопасности.
- Проверяется наличие ранее загруженных изображений и отображается их предпросмотр.
- Обрабатываются сообщения об ошибках, если они были.
-
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 текстов, сопровождающих изображения категорий.
В завершение, хочется отметить, что проделанная вами работа задает хорошую основу для дальнейшего расширения функционала без необходимости в зависимости от внешних плагинов. Это дает больше гибкости и контроля над проектом, что является значительным преимуществом для любого веб-разработчика.