Вопрос или проблема
На данный момент WordPress 6.2, Openverse был интегрирован в wordpress и доступен в разделе Медиа Вставки.
Я хочу разработать плагин, который также интегрирует другую службу стоковых изображений в вкладку Медиа Вставки, но при просмотре документации и исходного кода, похоже, нет никаких хуков, в которые я мог бы это вставить.
Насколько я знаю, категории зарегистрированы в константе inserterMediaCategories
в js редактора. Есть ли способ добавить к этому в плагине?
Вы можете использовать пример из block-editor.js и адаптировать его под ваши требования:
wp.data.dispatch('core/block-editor').registerInserterMediaCategory( {
name: 'openverse',
labels: {
name: 'Openverse',
search_items: 'Поиск в Openverse',
},
mediaType: 'image',
async fetch( query = {} ) {
const defaultArgs = {
mature: false,
excluded_source: 'flickr,inaturalist,wikimedia',
license: 'pdm,cc0',
};
const finalQuery = { ...query, ...defaultArgs };
// Иногда вам может понадобиться сопоставить поддерживаемые параметры запроса в соответствии с `InserterMediaRequest`.
// интерфейсом. В этом примере параметр запроса `search` называется `q`.
const mapFromInserterMediaRequest = {
per_page: 'page_size',
search: 'q',
};
const url = new URL( 'https://api.openverse.org/v1/images/' );
Object.entries( finalQuery ).forEach( ( [ key, value ] ) => {
const queryKey = mapFromInserterMediaRequest[ key ] || key;
url.searchParams.set( queryKey, value );
} );
const response = await window.fetch( url, {
headers: {
'User-Agent': 'WordPress/inserter-media-fetch',
},
} );
const jsonResponse = await response.json();
const results = jsonResponse.results;
return results.map( ( result ) => ( {
...result,
// Если ваш результат ответа включает свойство `id`, к которому вы хотите получить доступ позже, оно должно
// быть сопоставлено со свойством `sourceId` `InserterMediaItem`. Это может быть полезно, если вы предоставляете
// геттер URL отчета.
// Кроме того, вы всегда должны очищать значение `id` ваших результатов ответа, потому что
// оно используется для идентификации медиа-объектов WordPress.
sourceId: result.id,
id: undefined,
caption: result.caption,
previewUrl: result.thumbnail,
} ) );
},
getReportUrl: ( { sourceId } ) =>
`https://wordpress.org/openverse/image/${ sourceId }/report/`,
isExternalResource: true,
});
Простой пример, который просто возвращает статическое изображение, будет выглядеть так:
wp.data.dispatch('core/block-editor').registerInserterMediaCategory({
name: 'my-images',
labels: {
name: 'my-images',
search_items: 'Поиск my-images',
},
mediaType: 'image',
async fetch(query = {}) {
// Результат статического изображения
const results = [
{
url: 'https://cdn.pixabay.com/photo/2024/09/30/08/11/bird-9085008_1280.jpg',
previewUrl: 'https://cdn.pixabay.com/photo/2024/09/30/08/11/bird-9085008_1280.jpg',
id: 9085008,
caption: 'тест',
thumbnail: 'https://cdn.pixabay.com/photo/2024/09/30/08/11/bird-9085008_1280.jpg',
}
];
return results.map(result => ({
...result,
sourceId: result.id,
id: undefined,
caption: result.caption,
previewUrl: result.thumbnail,
}));
},
isExternalResource: true,
});
Ответ или решение
Чтобы добавить новые категории медиа в интерфейс вставки WordPress, начиная с версии 6.2, необходимо разработать плагин, который будет расширять функциональность редактора блоков. В этом ответе я подробно опишу, как это сделать, используя доступные API и функции WordPress.
Шаг 1: Создание структуры плагина
Создайте папку для вашего плагина в каталоге wp-content/plugins/
. Например, назовите ее my-custom-media-inserter
. Внутри этой папки создайте файл my-custom-media-inserter.php
, который будет основным файлом вашего плагина.
Шаг 2: Основной файл плагина
<?php
/**
* Plugin Name: My Custom Media Inserter
* Description: Расширяет интерфейс вставки медиа для добавления новой категории.
* Version: 1.0
* Author: Ваше имя
*/
// Зафиксируйте, что плагин активен и подключен
defined('ABSPATH') || exit;
// Подключаем скрипты в админке
function my_custom_media_inserter_enqueue_scripts() {
wp_enqueue_script(
'my-custom-media-inserter-script',
plugins_url('media-inserter.js', __FILE__),
array('wp-data', 'wp-element', 'wp-editor'),
'1.0',
true
);
}
add_action('enqueue_block_editor_assets', 'my_custom_media_inserter_enqueue_scripts');
Шаг 3: Создание JavaScript файла
Создайте файл media-inserter.js
в папке вашего плагина. В этом файле вы будете регистрировать новую категорию медиа в интерфейсе вставки:
wp.data.dispatch('core/block-editor').registerInserterMediaCategory({
name: 'my-images',
labels: {
name: 'Мои изображения',
search_items: 'Поиск в Мои изображения',
},
mediaType: 'image',
async fetch(query = {}) {
// Пример с статическим изображением
const results = [
{
url: 'https://cdn.pixabay.com/photo/2024/09/30/08/11/bird-9085008_1280.jpg',
previewUrl: 'https://cdn.pixabay.com/photo/2024/09/30/08/11/bird-9085008_1280.jpg',
id: 9085008,
caption: 'Тестовое изображение',
thumbnail: 'https://cdn.pixabay.com/photo/2024/09/30/08/11/bird-9085008_1280.jpg',
}
];
return results.map(result => ({
...result,
sourceId: result.id,
id: undefined,
caption: result.caption,
previewUrl: result.thumbnail,
}));
},
isExternalResource: true,
});
Шаг 4: Активируйте плагин
После завершения разработки плагина, перейдите в админку WordPress и активируйте ваш плагин через раздел "Плагины".
Шаг 5: Проверка функциональности
Теперь, когда вы откроете редактор блоков WordPress и перейдете к вкладке медиа для вставки, вы должны увидеть новую категорию "Мои изображения". Она будет содержать удобный интерфейс для вставки изображений, который вы можете настроить и расширить в соответствии с вашими требованиями.
Важные моменты
- Безопасность: Убедитесь, что ваши HTTP-запросы к API сторонних сервисов безопасны и обрабатывают ошибки корректно.
- SEO-оптимизация: Используйте описания для изображений и других медиа, чтобы улучшить индексацию вашего контента.
- Перевод: Чтобы сделать ваш плагин многоязычным, рекомендуется использовать функции локализации.
Следуя этим инструкциям, вы сможете создать плагин, который интегрирует дополнительные категории медиа в интерфейс вставки WordPress, улучшая пользовательский опыт и расширяя возможности редактора блоков.