import { render, useState, useEffect } from "@wordpress/element"; import { FocalPointPicker } from "@wordpress/components"; import apiFetch from "@wordpress/api-fetch"; const InlineFocalPointPicker = ({ postId, thumbnailUrl, initialFocalPoint }) => { const [focalPoint, setFocalPoint] = useState(initialFocalPoint); // Mettre à jour les champs cachés pour la sauvegarde useEffect(() => { // Créer ou mettre à jour les champs cachés let inputX = document.getElementById("thumbnail_focal_point_x"); let inputY = document.getElementById("thumbnail_focal_point_y"); let inputNonce = document.getElementById("thumbnail_focal_point_nonce"); if (!inputX) { inputX = document.createElement("input"); inputX.type = "hidden"; inputX.name = "thumbnail_focal_point_x"; inputX.id = "thumbnail_focal_point_x"; document.querySelector("form#post").appendChild(inputX); } if (!inputY) { inputY = document.createElement("input"); inputY.type = "hidden"; inputY.name = "thumbnail_focal_point_y"; inputY.id = "thumbnail_focal_point_y"; document.querySelector("form#post").appendChild(inputY); } if (!inputNonce) { inputNonce = document.createElement("input"); inputNonce.type = "hidden"; inputNonce.name = "thumbnail_focal_point_nonce"; inputNonce.id = "thumbnail_focal_point_nonce"; inputNonce.value = window.thumbnailFocalPointData?.nonce || ""; document.querySelector("form#post").appendChild(inputNonce); } inputX.value = focalPoint.x; inputY.value = focalPoint.y; }, [focalPoint]); const handleChange = (newFocalPoint) => { setFocalPoint(newFocalPoint); }; return (
Point focal de recadrage

Cliquez sur l'image pour définir le point focal utilisé lors du recadrage.

Position :{" "} {Math.round(focalPoint.x * 100)}% / {Math.round(focalPoint.y * 100)}%

); }; // Fonction pour injecter le focal point picker dans la meta box de thumbnail function injectFocalPointPicker() { // Attendre que la meta box de thumbnail soit chargée const thumbnailDiv = document.getElementById("postimagediv"); if (!thumbnailDiv) { return; } // Chercher le lien de la thumbnail pour vérifier qu'il y a une image const thumbnailLink = thumbnailDiv.querySelector("#set-post-thumbnail"); if (!thumbnailLink || !window.thumbnailFocalPointData) { return; } // Vérifier s'il y a une image const hasImage = thumbnailLink.querySelector("img"); if (!hasImage) { return; } // Créer le conteneur pour notre composant React let container = document.getElementById("thumbnail-focal-point-inline-root"); if (!container) { container = document.createElement("div"); container.id = "thumbnail-focal-point-inline-root"; // Trouver la div inside qui contient le contenu const insideDiv = thumbnailDiv.querySelector(".inside"); if (insideDiv) { // Injecter après tous les enfants existants de .inside insideDiv.appendChild(container); } else { // Fallback : injecter directement dans postimagediv thumbnailDiv.appendChild(container); } } const { postId, thumbnailUrl, focalPointX, focalPointY } = window.thumbnailFocalPointData; // Render le composant React render( , container ); } // Initialiser quand le DOM est prêt window.addEventListener("DOMContentLoaded", () => { injectFocalPointPicker(); // Écouter l'événement AJAX de WordPress pour le changement de featured image if (typeof jQuery !== "undefined") { jQuery(document).on("ajaxSuccess", function (event, xhr, settings) { // Vérifier si c'est l'AJAX de set featured image if ( settings.data && typeof settings.data === "string" && settings.data.indexOf("action=set-post-thumbnail") !== -1 ) { // WordPress a sauvegardé la nouvelle thumbnail, on peut recharger setTimeout(() => { location.reload(); }, 300); } }); // Écouter aussi la suppression de thumbnail jQuery(document).on("click", "#remove-post-thumbnail", function () { setTimeout(() => { location.reload(); }, 500); }); } }); // Hook dans la media library pour détecter quand une image est sélectionnée if (typeof wp !== "undefined" && wp.media) { // Stocker la référence du frame original const originalFeaturedImage = wp.media.featuredImage; if (originalFeaturedImage && originalFeaturedImage.frame) { const originalFrame = originalFeaturedImage.frame; // Remplacer la méthode frame wp.media.featuredImage.frame = function () { if (this._frame) return this._frame; this._frame = originalFrame.apply(this, arguments); // Écouter la sélection dans le frame this._frame.on("select", function () { // L'utilisateur a sélectionné une image // Ne rien faire ici, on attend l'AJAX success }); return this._frame; }; } }