我正在构建一个自定义的 Gutenberg 块,它向 WordPress REST API 发出请求以获取一些帖子。我正在使用axios向 REST 端点发出请求。
当结果返回时,有一个 Post 对象数组,我可以看到 Posts 的标题,但它们都包含在 JSON 对象中,title.rendered并且包含 HTML 实体,例如。
title: {
rendered: "This has a hyphen – oh dear"
}`
Run Code Online (Sandbox Code Playgroud)
我正在尝试<SelectControl>使用结果数据填充 a ,因此无法使用dangerouslySetInnerHTML可以解决实体问题的 React方法。那么在填充选项时如何摆脱这些实体呢?
这是我用来从 REST 响应中填充选项的代码:
const options = response.data.map((post) => {
return {
label: post.title.rendered,
value: post.id,
};
});
Run Code Online (Sandbox Code Playgroud) 我一直在到处寻找以找出如何在古腾堡块内添加事件。我正在努力使用 ACF 和 Foundation 添加手风琴系统。我使用 ACF 创建了一个块、字段和模板。我希望我的用户能够在视觉模式下打开和关闭手风琴。
我确实找到了以下脚本来监视块何时更改。唯一的问题是它在加载所有内容之前触发,我必须使用超时来允许块完全加载。我一直无法找到更好的方法来实现这一目标。有什么建议么?
const getBlockList = () => wp.data.select( 'core/editor' ).getBlocks();
let blockList = getBlockList();
wp.data.subscribe(() => {
const newBlockList = getBlockList();
const blockListChanged = newBlockList !== blockList;
blockList = newBlockList;
if ( blockListChanged ) {
setTimeout(function(){
jQuery(document).foundation();
Foundation.reInit($('[data-accordion]'));
}, 4000);
}
});
Run Code Online (Sandbox Code Playgroud) 我正在使用 ACF 块并有以下块。
acf_register_block_type(array(
'name' => 'columns',
'title' => __('Columns'),
'description' => __('For complex multi colomn rows.'),
// 'category' => 'formatting',
'render_template' => get_template_directory() . '/includes/blocks/templates/columns.php',
'enqueue_style' => get_template_directory_uri() . '/includes/blocks/css/columns.css',
'enqueue_script' => get_template_directory_uri() . '/includes/blocks/js/columns.js',
'keywords' => array('rows', 'content', 'column'),
'supports' => array('align' => array('wide', 'full')),
'mode' => 'auto',
));
Run Code Online (Sandbox Code Playgroud)
当我单击编辑器中的块以打开它进行编辑时,我需要运行一些 JS。我不知道是否有执行此操作的标准方法,所以我想我可以使用单击事件来运行我的函数,但它不会触发。这是 DOM 中块的图片。
我按照此处的文档添加了脚本。(底部有一个“添加块脚本”示例)
这是我精简后的 JS...
(function($){
var initializeBlock = function ($block) {
$('body').on('click', 'div[data-type="acf/columns"]', function () {
console.log('teeeeeeeest');
});
//... Other JS put here …Run Code Online (Sandbox Code Playgroud) 在 WordPress Gutenberg 编辑器中,我试图以编程方式在图像块上设置默认类,该类无需用户通过“附加 CSS”字段手动添加即可应用。
我曾尝试在图像块上应用默认样式,该样式最初有效 -
wp.blocks.registerBlockStyle( 'core/image', {
name: 'retailResidential',
label: 'Retail & Residential',
isDefault: true
});
Run Code Online (Sandbox Code Playgroud)
但是在用户更改自定义下拉列表中的字段后,我需要更新此默认类。更改此下拉列表时,我将取消注册块样式,然后注册新的默认块样式 - 但它对额外创建的图像没有影响(不使用更新的默认样式创建图像,仍使用旧的)。
wp.blocks.unregisterBlockStyle(
'core/image',
[ 'retailResidential', 'weddingsEvents', 'advertisingEditorial']
);
Run Code Online (Sandbox Code Playgroud)
更新默认图片块样式后是否需要刷新编辑器?或者有没有其他更好的方法来做到这一点?
更新块样式的参考
javascript wordpress advanced-custom-fields wordpress-gutenberg
如何使用wp.data.subscribe显示/隐藏特定帖子格式(音频、视频和图库)的块,我测试了这段代码,它运行良好,但它在编写帖子内容和选择任何其他选项时触发,因此目标块闪烁写作时。
wp.data.subscribe(() => {
var postFormat = wp.data.select('core/editor').getEditedPostAttribute('format');
$('#blockAudio, #blockVideo, #blockGallery').hide();
if( postFormat == 'gallery' ) {
$('#blockGallery').fadeIn();
}
});
Run Code Online (Sandbox Code Playgroud) 任何人都知道如何在 Wordpress 的古腾堡编辑器中重新排列、操作块类别我什至无法像使用块本身那样返回它们的列表,我能找到的只是“getCategories”,这似乎没有任何东西……新文档一点也不出色。
使用 WordPress 数据模块(古腾堡项目的@wordpress/data一部分)时,使用方法很容易获取帖子或其他实体。这是古腾堡内部使用它的一个例子。select('core').getEntityRecords
但是,在这种情况下我找不到处理错误的方法(例如网络错误)。正如有一种方法可以检查请求是否在进行中 ( isResolving),我希望有一个用于错误处理的方法。
一些背景:
getEntityRecords 方法apiFetch处理程序,getEntityRecords内部使用我创建了一个“选项卡式面板”(选项卡式内容)块,它本质上只是一个仅允许“面板”块的 InnerBlocks 组件。创建面板时,必须为面板指定一个标题,然后在面板和选项卡按钮中使用该标题。因此,在选项卡式面板的渲染函数中,我需要从子面板块中提取标题。
我可以使用几种方法,例如在 tabbed-panels-render.php 函数中使用正则表达式来搜索子 html 中的正确属性,但这似乎不是最好的方法。
我认为最简单的解决方案是监听面板块的任何更改并将更改(在本例中为标题和 id)保存到父级。我当前的方法基于此讨论,它使用钩子来监听更改。该部分似乎工作正常,但我需要将输出保存在某处,因此我将它们保存为选项卡式面板块的属性。起初这似乎工作正常,但将“setAttributes”方法直接放在编辑功能中会导致问题。如果页面上有太多选项卡式面板块,则 React 会抛出“渲染过多”错误。
我的“setAttributes”函数应该放在哪里,或者是否有更好的方法将数据从子级传递到父级?我考虑过在子进程中使用 useDispatch 钩子,但是我需要检查很多事件(标题更改、块重新排序、块被删除等)
这里是相关的js和php文件。有一些自定义元素,但您应该能够解析它。
选项卡式面板.js
import { arraysMatch } from 'Components/utils.js'
const { InnerBlocks } = wp.blockEditor
const { createBlock } = wp.blocks
const { Button } = wp.components
const { useDispatch, useSelect } = wp.data
const { __ } = wp.i18n
export const tabbedPanels = {
name: 'my/tabbed-panels',
args: {
title: __('Tabbed Panels', '_ws'),
description: __('Tabbable panels of content.', '_ws'),
icon: 'table-row-after',
category: …Run Code Online (Sandbox Code Playgroud) 古腾堡代码块用于在您的 WordPress 帖子和页面中显示代码块。在理想情况下,大多数人只是将代码直接复制并粘贴到这些块中。但我希望能够将代码输入到块中。
如何输入制表符?我希望能够在输入代码时缩进。如果我复制并粘贴一段代码,它不会丢失选项卡。但是,我一直无法输入。
键入 Tab 键会将焦点更改到下一个块。Shift-tab 将焦点更改到上一个块。CTRL-tab 什么也不做。
我已经搜索和谷歌搜索,我只能找到其他人问同样的问题,没有答案。
我正在构建一个古腾堡块,在保存/发布帖子时,我需要首先使用 API 保存一些块数据,然后使用 API 返回的 ID 更新块属性,最后将帖子保存在 Wordpress 中。
目前我正在使用下面的黑客来接管“发布”按钮,但我想要一个更好的解决方案。
setTimeout(function () {
jQuery(".editor-post-publish-button").click(function (event) {
// Send some requests to an API which returns an ID
// Update the post with new values
dispatch('core/block-editor').updateBlockAttributes(clientId, data);
// Finally save the Post
dispatch('core/editor').savePost();
})
});
}, 3000);
Run Code Online (Sandbox Code Playgroud)
在此解决方案之前,我尝试使用 subscribe() 并检查 isSavingPost 等事件,但没有成功。在此先感谢您的帮助!