WordPress教程

WordPress 古腾堡 Gutenberg 编辑器添加彩色渐变框

阿里云

之前我们分享文章是用纯代码和 css 编写的渐变框,然后加入了编辑器的按钮,但是 Gutenberg 用多了,这样来回切换也挺麻烦,想了一下能不能自定义一个区块来实现这个效果其实会更加的方便,花了一晚上的时间来了解了一下,其实实现方法也是不难的,下面就开始详细的介绍。

新的编辑器采用 Block 块的方式插入文章,把内容分成各种块,方便内容的调整和修改,同时也大大的扩展了编辑器的功能。目前相关的中文内容还是很少,需要了解更多内容可以参考官方介绍。

如图所示,通过创建自定义块可以更方便的调整文章内容功能和效果,以实现上图的自定义块为例,一步一步的创建。创建自定义的过程大致分为三步,只要按照我的教程一步一步的来,还是很简单的。

也想出现在这里?联系我们
创客主机

section

注册 Gutenberg Block 块,找到你主题的 function.php 文件,在最下方添加以下代码:

  1. // 古腾堡编辑器扩展
  2.  
  3. function duxq_block() {
  4.     wp_register_script( //引入核心js文件
  5.         'duxq_block',
  6.         get_stylesheet_directory_uri().'/gradient/gradient.js',
  7.         array( 'wp-blocks', 'wp-element' )
  8.     );
  9.     wp_register_style(  //引入css外观样式文件
  10.         'duxq_block',
  11.         get_stylesheet_directory_uri().'/gradient/gradient.css',
  12.         array( 'wp-edit-blocks' )
  13.     );
  14.     register_block_type( 'duxq/block', array(
  15.         'editor_script' => 'duxq_block',
  16.         'editor_style'  => 'duxq_block',
  17.     ) );
  18. }
  19. if (function_exists('register_block_type')) { //判断是否使用古腾堡编辑器
  20.     add_action( 'init', 'duxq_block' );
  21. }

语法解释:

  • wp_register_script () 引入核心的 js 文件
  • wp_register_style() 引入 css 外观样式文件
  • 最后我们检测一下是否使用古腾堡,然后排队注册

section

编辑 Block 块 JS 内容,块是的核心就是 JS 文件控制的,要实现的所有功能也是靠这个就是文件

  1. (function(blocks, editor, element, components, _) {
  2.  
  3.     var el = element.createElement;
  4.  
  5.     var RichText = editor.RichText;
  6.  
  7. 	var AlignmentToolbar = editor.AlignmentToolbar;
  8.  
  9.     var BlockControls = editor.BlockControls;
  10.  
  11.     var Fragment = element.Fragment;
  12.  
  13.  
  14.  
  15. /*---------渐变框自定义块---------*/
  16.  
  17.     blocks.registerBlockType('aduxq/button', {
  18.  
  19.         title: '渐变框',
  20.  
  21. 		category: 'layout',
  22.  
  23.         icon: {
  24.  
  25.             src: 'marker',
  26.  
  27.             foreground: '#20a0ff'
  28.  
  29.         },
  30.  
  31. 		description: '八种不同的渐变框',
  32.  
  33.         attributes: {
  34.  
  35.             content: {
  36.  
  37.                 type: 'array',
  38.  
  39.                 source: 'children',
  40.  
  41.                 selector: 'div',
  42.  
  43.             },
  44.  
  45.             alignment: {
  46.  
  47.                 type: 'string',
  48.  
  49.             },
  50.  
  51.             typeClass: {
  52.  
  53.                 source: 'attribute',
  54.  
  55.                 selector: '.an_q',
  56.  
  57.                 attribute: 'class',
  58.  
  59.             }
  60.  
  61.         },
  62.  
  63.         edit: function(props) {
  64.  
  65.             var content = props.attributes.content,
  66.  
  67.             typeClass = props.attributes.typeClass || 'gradient b1',
  68.  
  69.             alignment = props.attributes.alignment,
  70.  
  71.             isSelected = props.isSelected;
  72.  
  73.             function onChangeContent(newContent) {
  74.  
  75.                 props.setAttributes({
  76.  
  77.                     content: newContent
  78.  
  79.                 })
  80.  
  81.             }
  82.  
  83.             function changeType(event) {
  84.  
  85.                 var type = event.target.className;
  86.  
  87.                 props.setAttributes({
  88.  
  89.                     typeClass: 'an_q ' + type
  90.  
  91.                 })
  92.  
  93.             }
  94.  
  95.             function onChangeAlignment(newAlignment) {
  96.  
  97.                 props.setAttributes({
  98.  
  99.                     alignment: newAlignment
  100.  
  101.                 })
  102.  
  103.             }
  104.  
  105.             var richText = el(RichText, {
  106.  
  107.                 tagName: 'div',
  108.  
  109.                 onChange: onChangeContent,
  110.  
  111.                 value: content,
  112.  
  113.                 isSelected: props.isSelected,
  114.  
  115.                 placeholder: '按钮'
  116.  
  117.             });
  118.  
  119.             var outerHtml1 = el('div', {
  120.  
  121.                 className: typeClass
  122.  
  123.             },
  124.  
  125.             richText);
  126.  
  127.             var outerHtml = (el(element.Fragment, null, el(BlockControls, null, el(AlignmentToolbar, {
  128.  
  129.                 value: alignment,
  130.  
  131.                 onChange: onChangeAlignment,
  132.  
  133.             })), outerHtml1));
  134.  
  135.             var selector = el('div', {
  136.  
  137.                 className: 'duxq anz'
  138.  
  139.             },
  140.  
  141.             [el('button', {
  142.  
  143.                 className: 'gradient b1',
  144.  
  145.                 onClick: changeType
  146.  
  147.             },
  148.  
  149.             ''), el('button', {
  150.  
  151.                 className: 'gradient b2',
  152.  
  153.                 onClick: changeType
  154.  
  155.             },
  156.  
  157.             ''), el('button', {
  158.  
  159.                 className: 'gradient b3',
  160.  
  161.                 onClick: changeType
  162.  
  163.             },
  164.  
  165.             ''), el('button', {
  166.  
  167.                 className: 'gradient b4',
  168.  
  169.                 onClick: changeType
  170.  
  171.             },
  172.  
  173.             ''), el('button', {
  174.  
  175.                 className: 'gradient b5',
  176.  
  177.                 onClick: changeType
  178.  
  179.             },
  180.  
  181.             ''), el('button', {
  182.  
  183.                 className: 'gradient b6',
  184.  
  185.                 onClick: changeType
  186.  
  187.             },
  188.  
  189.             ''), el('button', {
  190.  
  191.                 className: 'gradient b7',
  192.  
  193.                 onClick: changeType
  194.  
  195.             },
  196.  
  197.             ''), el('button', {
  198.  
  199.                 className: 'gradient b8',
  200.  
  201.                 onClick: changeType
  202.  
  203.             },
  204.  
  205.             ''), ]);
  206.  
  207.  
  208.  
  209. 			return el('div', {
  210.  
  211.                 style: {
  212.  
  213.                     textAlign: alignment
  214.  
  215.                 }
  216.  
  217.             },
  218.  
  219.             [outerHtml, isSelected && selector])
  220.  
  221.         },
  222.  
  223.         save: function(props) {
  224.  
  225.             var content = props.attributes.content,
  226.  
  227.             alignment = props.attributes.alignment,
  228.  
  229.             typeClass = props.attributes.typeClass || 'gradient b1';
  230.  
  231.             if (alignment) {
  232.  
  233.                 var outerHtml = el('div', {
  234.  
  235.                     style: {
  236.  
  237.                         textAlign: alignment
  238.  
  239.                     }
  240.  
  241.                 },
  242.  
  243.                 el('div', {
  244.  
  245.                     className: typeClass
  246.  
  247.                 },
  248.  
  249.                 content))
  250.  
  251.             } else {
  252.  
  253.                 var outerHtml = el('div', {
  254.  
  255.                     className: typeClass
  256.  
  257.                 },
  258.  
  259.                 content)
  260.  
  261.             }
  262.  
  263.             return outerHtml
  264.  
  265.         },
  266.  
  267.     })
  268.  
  269. })(window.wp.blocks, window.wp.editor, window.wp.element, window.wp.components, window._, );

语法解释

  • blocks, editor, i18n, element, components等均是官方的 API 接口,实现数据传递
  • blocks.registerBlockType() 创建 Block 的函数接口
  • registerBlockType 的几个参数:title(标题)、icon(图标)、category(分组)、attributes(自定义属性)
  • 两个核心函数:edit 和 save ,分别定义了编辑时候的函数和保存的函数
  • 上面我们增加了几个按钮,传递onClick事件,实现点击切换不同的className

section

css 外观样式,通过创建了自定义块,能实现加载不同的 className 了,那我们添加一些样式在 gradient.css 文件中引用,就可以看到效果了!

  1. .duxq.anz button {
  2.  
  3.   margin: 10px;
  4.  
  5.   padding: .5em 1em;
  6.  
  7.   min-width: 33px;
  8.  
  9.   min-height: 33px;
  10.  
  11.   cursor: pointer
  12.  
  13. }
  14.  
  15.  
  16.  
  17. .duxq.anz button:hover {
  18.  
  19.   box-shadow: 0 0 10px #ddd;
  20.  
  21.   opacity: .8
  22.  
  23. }
  24.  
  25.  
  26.  
  27. .gradient {
  28.  
  29.   display: inline-block;
  30.  
  31.   margin: .5em;
  32.  
  33.   padding: .6em .8em;
  34.  
  35.   min-width: 80px;
  36.  
  37.   border: none;
  38.  
  39.   border-radius: 8px;
  40.  
  41.   box-shadow: -1px 4px 10px rgba(0,0,0,.2);
  42.  
  43.   color: #fff;
  44.  
  45.   text-align: center;
  46.  
  47.   transition: all .2s ease
  48.  
  49. }
  50.  
  51.  
  52.  
  53. .qe_fxan a,.qe_fxan a:hover {
  54.  
  55.   color: #fff
  56.  
  57. }
  58.  
  59.  
  60.  
  61. .gradient.b1 {
  62.  
  63.   color:#555555;overflow:hidden;margin:10px 0;padding:15px 15px 15px 15px;box-shadow:6px 0 12px -5px rgb(190,196,252),-6px 0 12px -5px rgb(189,196,252);background-color:#8EC5FC;background-image:linear-gradient(62deg,#8EC5FC 0%,#E0C3FC 100%);background-image:-webkit-linear-gradient(62deg,#8EC5FC 0%,#E0C3FC 100%)
  64.  
  65. }
  66.  
  67. .gradient.b2 {
  68.  
  69.   color:#555555;overflow:hidden;margin:10px 0;padding:15px 15px 15px 15px;box-shadow:6px 0 12px -5px rgb(255,176,172),-6px 0 12px -5px rgb(255,161,174);background-color:#ff9a8b66;background-image:linear-gradient(220deg,#FF9A8B 0%,#ff6a8838 55%,#FF99AC 100%);background-image:-webkit-linear-gradient(220deg,#ff9a8b7a 0%,#ff6a88ab 55%,#ff99ac82 100%)
  70.  
  71. }
  72.  
  73. .gradient.b3 {
  74.  
  75.   color:#555555;overflow:hidden;margin:10px 0;padding:15px 15px 15px 15px;box-shadow:6px 0 12px -5px rgb(253,223,234),-6px 0 12px -5px rgb(215,240,243);background-color:#FFDEE9;background-image:linear-gradient(0deg,#ffdee9c4 0%,#b5fffc8f 100%);background-image:-webkit-linear-gradient(0deg,#ffdee9c4 0%,#b5fffc8f 100%)
  76.  
  77. }
  78.  
  79. .gradient.b4 {
  80.  
  81.   color:#eeeeee;overflow:hidden;margin:10px 0;padding:15px 15px 15px 15px;box-shadow:6px 0 12px -5px rgb(12,85,141),-6px 0 12px -5px rgba(10,58,93,0);background-image:radial-gradient( circle 263px at 100.2% 3%,rgba(12,85,141,1) 31.1%,rgba(205,181,93,1) 36.4%,rgba(244,102,90,1) 50.9%,rgba(199,206,187,1) 60.7%,rgba(249,140,69,1) 72.5%,rgba(12,73,116,1) 72.6% )
  82.  
  83. }
  84.  
  85.  
  86.  
  87. .gradient.b5 {
  88.  
  89.   color:#eeeeee;overflow:hidden;margin:10px 0;padding:15px 15px 15px 15px;box-shadow:6px 0 12px -5px rgb(68,110,92),-6px 0 12px -5px rgb(204,212,163);background-image:linear-gradient( 102deg,rgba(68,110,92,1) 17.4%,rgba(107,156,120,1) 49.3%,rgba(154,183,130,1) 83.4%,rgba(247,237,191,1) 110.3% )
  90.  
  91. }
  92.  
  93. .gradient.b6 {
  94.  
  95.   color:#ffffff;overflow:hidden;margin:10px 0;padding:15px 15px 15px 15px;box-shadow:6px 0 12px -5px rgb(253,223,234),-6px 0 12px -5px rgb(215,240,243);background-image:radial-gradient( circle farthest-corner at -8.9% 51.2%,rgba(255,124,0,1) 0%,rgba(255,124,0,1) 15.9%,rgba(255,163,77,1) 15.9%,rgba(255,163,77,1) 24.4%,rgba(19,30,37,1) 24.5%,rgba(19,30,37,1) 66% )
  96.  
  97. }
  98.  
  99. .gradient.b7 {
  100.  
  101.   color:#ffffff;overflow:hidden;margin:10px 0;padding:15px 15px 15px 15px;box-shadow:6px 0 12px -5px rgb(175,160,208),-6px 0 12px -5px rgba(177,161,207,0);background-image:radial-gradient( circle farthest-corner at 10% 20%,rgba(95,117,227,1) 0%,rgba(188,167,205,1) 90% )
  102.  
  103. }
  104.  
  105. .gradient.b8 {
  106.  
  107.   color:#c7c7c7;overflow:hidden;margin:10px 0;padding:15px 15px 15px 15px;box-shadow:6px 0 12px -5px rgb(155,170,185),-6px 0 12px -5px rgba(177,161,207,0);background-image:radial-gradient( circle farthest-corner at 10% 20%,rgba(0,0,0,1) 0%,rgba(64,64,64,1) 90.2% )
  108.  
  109. }

以上的 css 仅后台展示的效果,文章的内的效果请把 padding:15px 15px 15px 15px; 中最后一个 15px 的值按照自己喜爱来调,博主的是 35px。以上 css 内容除了要添加到刚刚引入的 css 文件中,还需要添加到主题的相关 css 文件中,才能实现文章页中也显示相同效果!同时 css 样式可能还需要根据你的主题做一些优先级调整,才能显示正确的效果

WordPress 古腾堡 Gutenberg 编辑器添加彩色渐变框

已有 570 人购买
查看演示升级 VIP立刻购买

收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!