Vordefinierte Seitenverhältnisse in WordPress

, ,

Wie ich die WordPress-integrierten Seitenverhältnisse für einen benutzerdefinierten Bildkarussell-Block integriert habe.

Obwohl ich problemlos ein paar feste Optionen zu einem SelectControl hätte hinzufügen können, macht es Sinn, die Core-Funktionalität zu nutzen und zu erweitern, wo immer es möglich ist. Die theme.json-Konfigurationsdatei erlaubt es, eine Reihe vordefinierter Seitenverhältnis-Optionen festzulegen, und meine React-Komponente verwendet useSettings (siehe Dokumentation*) aus dem block-editor-Package, um diese Optionen abzurufen.

Da die SelectControl-Komponente aus dem Core verlangt, dass die Einträge im Options-Array im value/label-Format vorliegen, parse ich die Werte, die von useSettings zurückkommen, bevor ich sie in der SelectControl implementiere.

import { useSettings } from '@wordpress/block-editor';
import { SelectControl } from '@wordpress/components';

const MyComponent = ({aspectRatio, setAttributes}) => {
	const [defaultRatios, themeRatios] = useSettings('dimensions.aspectRatios.default', 'dimensions.aspectRatios.theme');

	// Merge core and custom values
	const aspectRatios = [...(defaultRatios || []), ...(themeRatios || [])];

	// Build an array which I can use in SelectControl
	const aspectRatioOptions = aspectRatios.map((ratio) => {
		return {
			value: ratio.ratio,
			label: ratio.name,
		};
	});

	return <SelectControl 
		label={_x('Aspect ratio', 'SelectControl label', 'mytextdomain')}
		value={aspectRatio} 
		options={aspectRatioOptions} 
		onChange={(aspectRatio) => setAttributes({ aspectRatioDesktop })} />;
};

(* Die möglichen Schlüsselwerte, die man an useSettings übergeben kann, scheinen derzeit nicht dokumentiert zu sein. Danke an Aki, der mich in die richtige Richtung gewiesen hat.)

A graphic visualisation of the concept of aspect ratios