这个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中渲染的,因此必须使用一些编辑器过滤器。