Font Awesome のアイコンピッカーを作成|create-block

Font Awesome のアイコンピッカーを作成|create-block

2025年5月31日

Font Awesome のアイコンを使ってアイコンピッカーを作成してみたい。分かりやすくするために簡単に3つのアイコンを作成することにする。必要なら後は増やしていくだけ。

ここ(icon-picker.js)ではアイコンピッカーの動きとレイアウトをほとんど作ってしまっている。
従って後はこのファイルを読み込むだけの感じになる。

<i class=”fa-solid fa-camera”>

ダウンロードしたFont Awesomeファイル全てをfontawesomeディレクトリに入れている。

fontawesome-iconpicker //新規作成したプラグイン名
  ├── build
  ├── node_modules 
  ├── polo-multiple-block.php 
  ├── package-lock.json
  ├── package.json 
  ├── readme.txt
  └── src
   	   └── fontawesome-iconpicker //新規作成したプラグイン名
             ├── block.json
   		     ├── edit.js
   		     ├── editor.scss
   		     ├── index.js
   		     ├── save.js
   		     ├── style.scss
             └── view.js  
   	   └── components
             ├── icon-picker
                   ├── icon-picker.js
   		           └── icon-picker.scss
   		     ├── info
                   ├── info.js
   		           └── info.scss
             └── fontawesome 
                   ├── css
   		           ├── js
                        ├── fontawesome.js
                        ├── regular.js
   		                ├── brands.js
                        └── solid.js
   		           ├── sprites
   		           ├── less
   		           ├── metadata
   		           ├── scss
   		           ├── sprites
                   ├── svgs
                   └── webfonts

以下の配列にFont Awesomeの出力用タグ<i class=”fa-solid fa-camera“>を使用している。
赤の部分が配列に入っている。

const icons = [
    {
        name: 'solid',
        value: 'camera',
    },
    {
        name: 'regular',
        value: 'bell',
    },
    {
        name: 'solid',
        value: 'calendar',
    },
    {
        name: 'solid',
        value: 'unlock',
    },

];

import './icon-picker.scss';

const IconPicker = ({
    attrName,
    attrValue,
    setAttributes,
}) => {
    return (
        <div className="icon-picker-wrapper">
            <h3>選択されたアイコン</h3>
            <div className="section-icon">
                <span className={`dashicons dashicons-${attrValue}`}></span>
            </div>
            <div className="icons-list">
                {
                    icons && icons.map((icon, index) => {
                        return (
                            <div key={index} className="icon-item">
                                <button className="icon-item-button" onClick={() => setAttributes({
                                    [attrName]: icon.value
                                })}>
                                    <span className={`dashicons dashicons-${icon.value}`}></span>
                                </button>
                            </div>
                        )
                    })
                } 
            </div>
        </div>   
    )
}


export default IconPicker;

icon-picker.scss:アイコンピッカーのスタイルを設定
インストールパス:/plugins/icon-picker/src/components/icon-picker/icon-picker.scss

.icons-list {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(37px, 1fr));
	width: 250px;
}
button.icon-item-button {
	padding: 7px;
	margin: 1.5px;
}

block.json 14-20行目を追加

{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "create-block/fontawesome-iconpicker",
	"version": "0.1.0",
	"title": "Fontawesome Iconpicker",
	"category": "widgets",
	"icon": "smiley",
	"description": "Example block scaffolded with Create Block tool.",
	"example": {},
	"supports": {
		"html": false
	},
	"attributes":{
		"icon": {
			"type": "string",
			"default": "bell"
		}
	},
	"textdomain": "fontawesome-iconpicker",
	"editorScript": "file:./index.js",
	"editorStyle": "file:./index.css",
	"style": "file:./style-index.css",
	"viewScript": "file:./view.js"
}
import { __ } from '@wordpress/i18n';

import { useBlockProps, InspectorControls } from '@wordpress/block-editor';
import { PanelBody } from '@wordpress/components';
import { Fragment } from '@wordpress/element';
import IconPicker from '../components/icon-picker/icon-picker';


export default function Edit({ attributes, setAttributes }) {

	const { icon } = attributes;

	return (
		<Fragment>
			<InspectorControls>
				<PanelBody title={__('アイコンの選択', 'first-block')} initialOpen={false}>
					<IconPicker
						attrName="icon"
						attrValue={icon}
						setAttributes={setAttributes}
					/>
				</PanelBody>
			</InspectorControls>
			<div {...useBlockProps()}>
				<p className="section-icon">
					<span className={`dashicons dashicons-${icon}`}></span>
					{__('Icon Picker – edit.js からこんにちは!', 'icon-picker')}
				</p>
			</div>
		</Fragment>
	);
}
.wp-block-create-block-fontawesome-iconpicker {
	border: 1px dotted #f00;
}
import { useBlockProps } from '@wordpress/block-editor';

export default function save({ attributes }) {

	const { icon } = attributes;

	return (
		<div {...useBlockProps.save()}>
			<p className="section-icon">
				<span className={`dashicons dashicons-${icon}`}></span>
				Icon Picker – save.js からこんにちは!
			</p>
		</div>
	);
}
.wp-block-create-block-fontawesome-iconpicker {
	background-color: #21759b;
	color: #fff;
	padding: 2px;
}

これでアイコンピッカーとして作成されるが、クラス名をdashiconsから変更すると機能しない。多分、どこかでCSSでの設定があるのだと思うが勉強不足で良くわからない。

しかし、このdashiconsをそのまま使って、font awesomeのアイコンが表示されたので良しとする。