Вопрос или проблема
Я пытаюсь создать блок, который отображает метаданные поста для каждого поста, отображаемого блоком Query Loop, а именно ссылку с разным URL для каждого поста.
Проблема, с которой я столкнулся, заключается в том, что кажется невозможным получить идентификаторы постов в цикле. Есть ли способ получить или передать идентификаторы запрашиваемых постов в вложенный блок? Как блоки, такие как заголовок поста или отрывок поста, обрабатывают это?
Вот фрагмент моего edit.js:
const Edit = ({context}) => {
const blockProps = useBlockProps();
const metaValue = useSelect((select) => {
const { getEntityRecord } = select('core');
const { getCurrentPostId } = select('core/editor');
const currentPostId = getCurrentPostId();
if (!currentPostId) {
return null;
}
// Получить метаданные для поста с текущим идентификатором поста
const post = getEntityRecord('postType', 'portfolio', currentPostId);
return post && post.meta ? post.meta['custom_link_text'] : null;
}, []);
// Показать индикатор загрузки, пока метаданные загружаются
if (metaValue === undefined) {
return (
<div { ...blockProps }>
<Spinner />
</div>
);
}
// Если метаданные не заданы, показать текст-заполнитель
if (!metaValue) {
return (
<div { ...blockProps }>
<Placeholder
icon="admin-post"
label={__('Нет доступных метаданных', 'linkplugin')}
instructions={__('Отображайте значение метаданных здесь.', 'linkplugin')}
/>
</div>
);
}
// Отобразить значение метаданных поста
return (
<div { ...blockProps }>
<p>{__('Значение метаданных:', 'linkplugin')} {metaValue}</p>
</div>
);
};
.
Ответ или решение
Чтобы создать блок, который отображает метаданные постов в рамках блока Query Loop в редакторе блоков WordPress, вам необходимо учитывать несколько аспектов, особенно когда речь идет о получении идентификаторов постов, которые обрабатываются внутри цикла.
Проблематика
Вы столкнулись с проблемой получения идентификаторов постов в контексте Query Loop блока, так как этот блок позволяет выводить несколько постов, но не предоставляет напрямую идентификаторы этих постов для использования в ваших вложенных блоках. Тем не менее, есть способы обойти это ограничение и корректно отображать метаданные для каждого поста, используя подходы, аналогичные тем, которые применяют блоки, такие как Post Title или Post Excerpt.
Решение
-
Используйте контекст блока: Запросите необходимые данные о постах прямо внутри вашего блока, используя подход отложенной загрузки данных. Вы сможете использовать
useSelect
для получения данных из редактора. -
Получение данных поста: Вы должны использовать функцию
getEntityRecords
вместоgetEntityRecord
, чтобы получить все записи в цикле. После этого можно будет проходить по каждому посту и извлекать нужные метаданные. -
Пример кода:
Ваша текущая реализация работает только с текущим постом. Мы можем немного изменить её, чтобы она получала данные из Query Loop:
import { useSelect } from '@wordpress/data';
import { useBlockProps } from '@wordpress/block-editor';
import { Spinner, Placeholder } from '@wordpress/components';
const Edit = ({ context }) => {
const blockProps = useBlockProps();
const posts = useSelect((select) => {
const { getEntityRecords } = select('core');
return getEntityRecords('postType', 'portfolio', { per_page: -1 });
}, []);
// Show spinner while posts are loading
if (!posts) {
return (
<div {...blockProps}>
<Spinner />
</div>
);
}
// If no posts are found, show placeholder text
if (posts.length === 0) {
return (
<div {...blockProps}>
<Placeholder
icon="admin-post"
label={__('No posts available', 'linkplugin')}
instructions={__('Display meta value here.', 'linkplugin')}
/>
</div>
);
}
// Render the meta values for each post
return (
<div {...blockProps}>
{posts.map((post) => {
const metaValue = post.meta ? post.meta['custom_link_text'] : null;
return (
<div key={post.id}>
<p>{__('Meta Value for post', 'linkplugin')}: {metaValue || __('No meta data available', 'linkplugin')}</p>
</div>
);
})}
</div>
);
};
export default Edit;
Объяснение кода
- Использование
getEntityRecords
: Это позволяет получить массив постов типа ‘portfolio’. - Цикл отображения постов: При помощи метода
map
отображаются метаданные для каждого поста. - Отображение состояния загрузки: Используя
Spinner
иPlaceholder
, вы обеспечиваете информативные сообщения для пользователя.
Итоги
Теперь ваш блок может корректно отображать метаданные для каждого поста, обрабатываемого в цикле Query Loop. Благодаря изменениям и правильному использованию хуков WordPress вы можете динамически управлять выводом информации, предоставляя пользователям актуальные данные для каждого поста.
Эта реализация не только решает вашу проблему, но и отвечает принципам SEO и высоких стандартов читаемости, что делает её не только функциональной, но и удобной для конечного пользователя.