Вопрос или проблема
Я создаю блок, который показывает бесконечный список постов, используя API взаимодействия:
render.php
<?php
$block_attributes = get_block_wrapper_attributes()
?>
<div
<?php echo $block_attributes; ?>
<?php
echo wp_interactivity_data_wp_context(
array(
'posts' => null,
'number' => $attributes['number'],
'offset' => 0,
'category' => $attributes['category'],
)
);
?>
data-wp-interactive="milp-store"
data-wp-init="actions.getFirstPosts"
data-wp-on-window--beforeunload="callbacks.saveState"
>
<div data-wp-watch="callbacks.renderPosts"></div>
<button data-wp-style--display="context.display" data-wp-on--click="actions.getPosts"><?php _e( 'Load More', 'my-infinite-latest-posts' ); ?></button>
</div>
view.js
import { store, getContext, getElement } from '@wordpress/interactivity';
store('milp-store', {
callbacks: {
renderPosts() {
const context = getContext();
const element = getElement();
if (context.posts !== null) {
var html="";
for (var i = 0; i < context.posts.length; i++) {
var post = context.posts[i];
html += '<article id="post-' + post.id + '" class="wp-block-my-infinite-latest-posts__post">';
html += '<h2 class="wp-block-my-infinite-latest-posts__post-title">' + post.title.rendered + '</h2>';
html += '<div class="wp-block-my-infinite-latest-posts__post-content">' + post.content.rendered + '</div>';
html += '</article>';
}
element.ref.innerHTML += html;
}
},
saveState() {
const context = getContext();
// Store posts offset in sessionStorage when changing pages.
sessionStorage.setItem('posts-offset', context.offset);
}
},
actions: {
*getFirstPosts() {
const context = getContext()
const number = sessionStorage.getItem('posts-offset') || context.number;
const posts = yield fetch(
'https://' + window.location.hostname + '/wp-json/wp/v2/posts?per_page=" + encodeURIComponent(number) + "&offset=0&categories=" + encodeURIComponent(context.category) + "&_fields=id,title,content',
{
method: 'GET',
headers: {
'Cache-Control': 'max-age=60, must-revalidate',
},
}
).then(function (response) {
// The X-WP-Total response header fields contains the total number of records in the collection.
context.total = response.headers.get('X-WP-Total');
return response.json();
}).catch(function (error) {
console.error(error);
});
context.posts = posts;
context.offset = parseInt(number);
context.display = (context.offset < context.total) ? 'block' : 'none';
},
*getPosts() {
const context = getContext();
const posts = yield fetch(
'https://' + window.location.hostname + '/wp-json/wp/v2/posts?per_page=" + encodeURIComponent(context.number) + "&offset=" + encodeURIComponent(context.offset) + "&categories=" + encodeURIComponent(context.category) + "&_fields=id,title,content',
{
method: 'GET',
headers: {
'Cache-Control': 'max-age=60, must-revalidate',
},
}
).then(function (response) {
return response.json();
}).catch(function (error) {
console.error(error);
});
context.posts = posts;
context.offset = parseInt(context.offset) + parseInt(context.number);
context.display = (context.offset < context.total) ? 'block' : 'none';
},
}
});
block.json
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "my/infinite-latest-posts",
"title": "My Infinite Latest Posts",
"description": "Display latest posts.",
"textdomain": "my-infinite-latest-posts",
"category": "widgets",
"attributes": {
"category": {
"type": "integer",
"default": 0
},
"number": {
"type": "integer",
"default": 5
}
},
"supports": {
"spacing": {
"margin": true,
"padding": true
},
"interactivity": true
},
"editorScript": "file:./index.js",
"viewScriptModule": "file:./view.js",
"style": "file:./style-index.css",
"render": "file:./render.php"
}
WordPress включает стили вариаций блока только в том случае, если соответствующий блок присутствует на отрисованной странице. Однако, так как мой блок бесконечных последних постов динамически загружает посты через API взаимодействия, WordPress не может обнаружить наличие блоков внутри постов во время рендеринга. Как я могу гарантировать, что необходимые стили вариаций блока всегда будут включены, даже если WordPress изначально не распознает блоки на странице?
Ответ или решение
Чтобы гарантировать включение стилей вариаций блока в WordPress, даже если блоки динамически рендерятся посредством Interactivity API и не могут быть обнаружены WordPress во время первоначального рендеринга страницы, можно применить несколько подходов. Рассмотрим, как это сделать, исходя из описанной проблемы:
Фокус на проблеме
Поскольку ваш блок динамически загружает остальные блоки с использованием Interactivity API, WordPress не будет автоматически включать стили для этих блоков, потому что они изначально не обнаруживаются в структуре страницы.
Решение
1. Принудительное добавление стилей на страницу
Вы можете вручную включить необходимые стили в заголовок страницы, используя wp_enqueue_style
, когда ваш стерно загружается. Добавьте функцию в вашем functions.php
или в другом подходящем месте вашего плагина или темы, чтобы стили были загружены независимо от того, есть ли блоки на странице.
function enqueue_infinite_posts_styles() {
// Убедитесь, что путь к файлу стилей правильный
wp_enqueue_style('my-infinite-latest-posts-style', get_template_directory_uri() . '/path/to/style-index.css', array(), '1.0', 'all');
}
add_action('wp_enqueue_scripts', 'enqueue_infinite_posts_styles');
2. Использование inline-стилей
Если вы хотите быть уверенным, что стили точно будут применены, можете встроить их непосредственно в HTML-код вашего блока. Хотя это не является лучшей практикой в плане производительности и поддерживаемости, это гарантирует их наличие на странице:
echo '<style>
.wp-block-my-infinite-latest-posts__post { /* ваш стиль */ }
.wp-block-my-infinite-latest-posts__post-title { /* ваш стиль */ }
.wp-block-my-infinite-latest-posts__post-content { /* ваш стиль */ }
</style>';
Эмоции и обоснование
Такой подход гарантирует, что ваши стили будут доступны независимо от того, каким образом ваш блок внедряется на страницу. Это важно для поддержания консистенции дизайна и функциональности.
Стратегия и действие
- Предусмотрительность. Обеспечьте полное покрытие стилей для всех состояний блока, в том числе для динамически подгружаемых элементов.
- Гибкость. Будьте готовы корректировать стили при изменении требований проекта или обновлении WordPress.
- Масштабируемость. Убедитесь, что ваш подход легко может быть адаптирован к другим подобным задачам в будущем.
Точки контроля
- Кросс-браузерность. Убедитесь, что стили корректно отображаются во всех браузерах.
- Производительность. Отслеживайте, как ваши решения влияют на скорость загрузки страниц и взаимодействие пользователей.
Итоги
Внедряя эти решения, вы сможете обеспечить стабильное и приятное пользовательское взаимодействие, сохраняя стиль и действие вашего блока в любых условиях, даже при использовании таких мощных инструментов, как Interactivity API от WordPress.