标签: wordpress-gutenberg

将 WordPress REST API 用于 Gutenberg 块时,不会对 HTML 实体进行解码

我正在构建一个自定义的 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)

rest wordpress block html-entities wordpress-gutenberg

7
推荐指数
1
解决办法
1204
查看次数

WordPress 在古腾堡块内添加 onclick 事件

我一直在到处寻找以找出如何在古腾堡块内添加事件。我正在努力使用 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)

javascript wordpress wordpress-gutenberg gutenberg-blocks

7
推荐指数
1
解决办法
7259
查看次数

Wordpress Gutenberg ACF 块打开块时如何添加 JS

我正在使用 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 中块的图片。

阻止 HTML

我按照此处的文档添加了脚本。(底部有一个“添加块脚本”示例)

这是我精简后的 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)

javascript wordpress wordpress-gutenberg gutenberg-blocks

7
推荐指数
0
解决办法
1952
查看次数

我可以使用 Javascript 更新 Wordpress 编辑器中的默认类吗?

在 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

7
推荐指数
1
解决办法
406
查看次数

正确使用 wp.data.subscribe

如何使用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)

javascript wordpress wordpress-gutenberg

6
推荐指数
2
解决办法
2482
查看次数

如何在 Wordpress 中列出和重新排列或操作古腾堡块类别

任何人都知道如何在 Wordpress 的古腾堡编辑器中重新排列、操作块类别我什至无法像使用块本身那样返回它们的列表,我能找到的只是“getCategories”,这似乎没有任何东西……新文档一点也不出色。

javascript php wordpress wordpress-gutenberg

6
推荐指数
1
解决办法
1037
查看次数

WordPress 数据模块选择器中的错误处理

使用 WordPress 数据模块(古腾堡项目的@wordpress/data一部分)时,使用方法很容易获取帖子或其他实体。这是古腾堡内部使用它的一个例子。select('core').getEntityRecords

但是,在这种情况下我找不到处理错误的方法(例如网络错误)。正如有一种方法可以检查请求是否在进行中 ( isResolving),我希望有一个用于错误处理的方法。

一些背景:

javascript wordpress wordpress-gutenberg

6
推荐指数
0
解决办法
115
查看次数

获取 InnerBlocks 的属性并将其保存到父级

我创建了一个“选项卡式面板”(选项卡式内容)块,它本质上只是一个仅允许“面板”块的 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 reactjs wordpress-gutenberg gutenberg-blocks

6
推荐指数
1
解决办法
4721
查看次数

在古腾堡代码块中输入制表符

古腾堡代码块用于在您的 WordPress 帖子和页面中显示代码块。在理想情况下,大多数人只是将代码直接复制并粘贴到这些块中。但我希望能够将代码输入到块中。

如何输入制表符?我希望能够在输入代码时缩进。如果我复制并粘贴一段代码,它不会丢失选项卡。但是,我一直无法输入。

键入 Tab 键会将焦点更改到下一个块。Shift-tab 将焦点更改到上一个块。CTRL-tab 什么也不做。

我已经搜索和谷歌搜索,我只能找到其他人问同样的问题,没有答案。

wordpress wordpress-gutenberg gutenberg-blocks

6
推荐指数
1
解决办法
375
查看次数

在 savePost 运行之前更新古腾堡块内容

我正在构建一个古腾堡块,在保存/发布帖子时,我需要首先使用 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 等事件,但没有成功。在此先感谢您的帮助!

javascript wordpress-gutenberg

6
推荐指数
0
解决办法
914
查看次数