块编辑器:如何在Java中获取WordPress管理用户界面中的标题和帖子内容?

时间:2019-11-03 作者:Blackbam

为了适应一些旧的SEO模块(为TinyMCE编写),我必须通过JavaScript访问当前的帖子标题和帖子内容。我过去一直在回避古腾堡,但这似乎不再可能了。

在旧的SEO模块中admin.js:

var title = $(\'#title\').val().trim();
var content = $(\'#content\').val().trim();
这些领域在古腾堡已经不存在了。我试图在文档中找到正确的方法,但到目前为止运气不好。我发现:

wp.data.select("core/editor").getBlocks()
wp.data.select("core")
但在我的例子中,两者似乎都是空数组(尽管这篇文章有内容)。我基本上只需要一种方法来获取所有块的文本内容(如果可能的话,还可以与主要帖子标题分开)。谁知道怎么做?

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

如果我们在浏览器开发工具控制台中执行此操作:

var b = wp.data.select("core/editor");
然后我们可以检查b 变量,以查看它通过自动完成或调试工具公开了哪些函数。

注意,我没有打电话getBlocks(), 帖子标题从来都不是帖子内容的一部分,为什么现在会改变呢?

环顾四周给了我这个a.getCurrentPost(), 它返回带有帖子标题的帖子对象,但这将是原始帖子标题,而不是当前帖子标题,并且不会在用户编辑标题时更新

然而,一个快速的谷歌给出了一个与stackoverflow相同的问题,并给出了一个深入的答案:https://stackoverflow.com/questions/51674293/use-page-title-in-gutenberg-custom-banner-block

const title = select("core/editor").getEditedPostAttribute( \'title\' );

SO网友:JonShipman

只是更新2021的答案。您需要熟悉节点和可选纱线(个人喜好,但通常可以npm run x 对于yarn x 脚本)。

使用初始化文件夹yarn init 它会帮助你解决一些问题。通常,项目名称与插件或主题名称相同,版本与插件或主题版本相同。之后你会得到package.json. 现在添加包。

在命令提示符/终端中,我们要yarn add @wordpress/scripts @wordpress/data @wordpress/block-editor @wordpress/blocks. 如果您想访问React组件,还可以@wordpress/element 您可以加载项。

接下来,您需要创建作为编译起点的源文件。您可以通过导入使用一个JS文件或多个JS文件。通常,我会假设多个,以避免将来的重构。

对于露齿而笑的人,让我们把我们的切入点js/src/blocks.js, 相对于项目的根。在这个文件中,让我们导入registerBlockType 像这样:

import { registerBlockType } from \'@wordpress/blocks\';

接下来,让我们为这个SEO模块创建目录js/src/seo/. 这些可以是任何东西,我只是顺其自然。

我们将返回该文件夹,但首先让我们完成这些块。js。

以块的形式导入该目录的导出。js。

import * as seo from \'./seo\';

正如我前面提到的在一个项目中支持多个块,我们将构建一个数组并在每次导入上运行registerBlockType。

[ seo ].forEach( ( block ) => {
  if ( ! block ) {
    return;
  }

  const { settings, name } = block;
  registerBlockType( name, settings );
} );
现在让我们进入实际的块本身。在seo文件夹内创建index.jsblock.json 文件。

内部block.json 要引用的文件https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/, 但要开始,您至少需要以下几点:

"apiVersion": 2,
"name": "namespace/seo",
"title": "Your SEO Block",
"category": "widgets",
"description": "SEO Classic Port",
"textdomain": "namespace"
我可以连续几天谈论街区。json文件。但这会让你开始。

接下来是索引。js文件。您需要使用以下导入启动文件:

import { useBlockProps } from \'@wordpress/block-editor\';
import { useSelect } from \'@wordpress/data\';
import metadata from \'./block.json\';
现在让我们使用它们。

const { name } = metadata;
export { name }

export const settings = {
  ...metadata,
  edit: function() {
    const { title, content } = useSelect(
        ( select ) => {
          return {
            title: select( \'core/editor\' ).getEditedPostAttribute( \'title\' ),
            content: select( \'core/editor\' ).getEditedPostContent(),
          }
        },
        []
    );

    return (
      <div { ...useBlockProps() }>
        <div>Title: { title }</div>
        <div>Content: { content }</div>
      </div>
    );
  },
  save: () => null,
};
我们正在导出中引用的名称和设置对象blocks.js 在上面还有,我们现在什么都没做,只是在保存。大多数时候,我都会使用这些“;“快速块”;编辑一段post meta,因此返回null是完全有效的。

我们只需要再多走两步就可以把一切都解决了。添加我们的块。js到包脚本并注册脚本(如果导入任何css或sass,还可以选择任何样式)。

首先是包脚本。添加以下内容:

"scripts": {
  "build": "wp-scripts build ./js/src/blocks.js --output-path=./js/build",
  "start": "wp-scripts start ./js/src/blocks.js --output-path=./js/build"
}
使用这些脚本,运行yarn start 将在src/build文件夹中创建已编译JS的开发副本。同样地yarn build 将创建一个小型生产就绪编译。

最后,我们需要将这些文件排队。通常我们会使用admin_enqueue_scripts 然而,您可以使用此块将公共js排队。所以我喜欢使用init。使用init的另一个原因,我们将使用register_block_type_from_metadata.

将其包含在插件文件或函数中。php(主题)。为了详细起见,我假设使用插件。您需要将插件引用函数更改为主题友好的函数。

function register_block_files() {
  $asset_file = include plugin_dir_path( __FILE__ ) . \'js/build/blocks.asset.php\';

  wp_register_script(
    \'your-blocks\',
    plugins_url( \'js/build/blocks.js\', __FILE__ ),
    $asset_file[\'dependencies\'],
    $asset_file[\'version\'],
    false
  );

  $folders = array(
    \'seo\',
  );

  foreach ( $folders as $folder ) {
    register_block_type_from_metadata(
      plugin_dir_path( __FILE__ ) . \'js/src/\' . $folder . \'/block.json\',
      array(
        \'editor_script\' => \'your-blocks\',
      )
    );
  }  ​
}

add_action( \'init\', \'register_block_files\' );
这应该就是全部!您将创建一个加载到小部件下的块,并将打印标题:文章标题,以及内容:文章的html内容。显然,您可以在编辑功能中执行您想要的操作。通常,我将保存和导入拆分为单独的文件并导入它们。

相关推荐

如何在wp_post`post_content`中剥离javascript

我的网站正在遭受SQL注入攻击,重定向到广告网站dolohen[dot]com。我需要在提供javascript之前去掉它。Is there a filter I can add or update to remove everything between tags in wp_posts post_content我不熟悉wordpress编程,但不熟悉sql和数据库。这有点让人困惑,因为有些人想在帖子中加入javascript,但却不能。然而,这些SQL注入器似乎是随心所欲的!ThanksPhil公