如何更改核心块的HTML输出顺序?

时间:2020-11-25 作者:Unfu

我想更改最新帖子块的HTML输出(即:将日期包装在帖子链接中)。

我知道我可以\'blocks.getSaveElement\' 并检索元素、块类型和属性等内容。

但是这些都没有帮助,因为这个块是通过php在前端呈现的。是否是操纵标记以创建自定义块并复制核心块文件的唯一方法?这似乎不直观,而且交换两个标记需要做太多的工作。仅仅编写JS来操作前端是不可取的(可能会使元素跳跃)。

关于如何更好地实现这一点,有什么想法吗?

1 个回复
SO网友:kero

这个render_block 过滤器可以做到这一点-我刚刚测试了一个新的安装。但是,您必须使用最终的HTML,因此它有点难看。

以下代码将复制第一个<a> 标记副本并将其环绕<time> 列表中的标记。

\\add_filter(\'render_block\', function($content, $parsed): string {
        // skip other blocks
        if ($parsed[\'blockName\'] !== \'core/latest-posts\') {
                return $content;
        }

        // skip latest posts that don\'t display the date
        if (empty($parsed[\'attrs\'][\'displayPostDate\']) || !$parsed[\'attrs\'][\'displayPostDate\']) {
                return $content;
        }

        $dom = new \\DomDocument();
        // parse the HTML, the @ is required because DomDocument
        // doesn\'t know about HTML5\'s <time>
        @$dom->loadHTML($content);

        // get each individual post
        foreach ($dom->getElementsByTagName(\'li\') as $entry) {
                $links = $entry->getElementsByTagName(\'a\');
                if ($links->count() === 0) {
                        continue;
                }

                foreach ($entry->getElementsByTagName(\'time\') as $time) {
                        // clone the first <a>
                        $link = $links->item(0)->cloneNode();
                        // wrap the <time> around that <a>
                        $time->parentNode->replaceChild($link, $time);
                        $link->appendChild($time);
                }
        }

        // $dom->saveHTML() returns false on error
        $newContent = $dom->saveHTML();
        if ($newContent !== false) {
            return $newContent;
        }

        return $content;
}, 10, 2);
但是,这不会改变编辑器内的输出。由于块现在纯粹是在React中渲染的,因此必须使用一些编辑器过滤器。

相关推荐

如何将Apply_Filters()与类函数一起使用?

我想允许我的用户重写函数。这是一个插件。我相信apply\\u filters()可以用于此。这可以被add\\u filter()覆盖。我对如何使用它感到困惑。如果我有这样的课class Example{ public function hello(){ $title = the_title_attribute(); return $title; } } 我应该做什么更改以允许修改$标题?在哪里放置应用过滤器?谢谢