Table des matières
Php → javascript
Travail de base
Composant de notation des étoiles
Maison interface Web tutoriel CSS Comment construire des composants Vue dans un thème WordPress

Comment construire des composants Vue dans un thème WordPress

Apr 11, 2025 am 11:03 AM

Comment construire des composants Vue dans un thème WordPress

Vous voulez lire directement le code? Veuillez ignorer cette section.

Ce didacticiel est écrit sur la base de Vue 2 et utilise le "modèle en ligne". Vue 3 a obsolète cette fonctionnalité, mais vous pouvez obtenir des effets similaires en utilisant des alternatives telles que la mise en place de modèles dans des balises de script.

Il y a quelques mois, je construisais un site Web WordPress et j'avais besoin d'un formulaire avec de nombreux champs conditionnels avancés. Différents choix nécessitent différentes options et informations, tandis que nos clients ont besoin d'un contrôle complet sur tous les champs 1 . De plus, le formulaire doit apparaître à plusieurs emplacements sur chaque page et avoir des configurations légèrement différentes.

Et l'instance de titre du formulaire doit être mutuellement exclusive au menu Hamburger, de sorte que l'ouverture de l'une ferme l'autre.

Et le formulaire contient du contenu texte lié au référencement.

Et nous espérons que la réponse du serveur pourra présenter des commentaires d'animation mignons.

(appel!)

L'ensemble du processus était si compliqué que je ne voulais pas gérer tous ces États manuellement. Je me souviens avoir lu l'article de Sarah Drasner "Remplacer jQuery par Vue.js: Aucune étape de construction requise", qui montre comment remplacer le motif JQuery classique par un simple Vue Microapp. Cela semble être un bon point de départ, mais j'ai rapidement réalisé que les choses peuvent devenir désordonnées du côté PHP de WordPress.

Ce dont j'ai vraiment besoin, ce sont des composants réutilisables .

Php → javascript

J'aime l'approche statiquement préférée des outils JamStack comme Nuxt et je veux faire quelque chose de similaire ici - envoyant du contenu complet du serveur et montée sur le client.

Mais PHP n'a pas de méthode intégrée pour gérer les composants. Cependant, il prend en charge l'inclusion de fichier 2 dans d'autres fichiers. WordPress a une abstraction require appelée get_template_part , qui fonctionne par rapport au dossier de thème et est plus facile à utiliser. La division du code en pièces de modèle est la chose la plus proche que WordPress offre aux composants 3 .

Vue, en revanche, est totalement une question de composants, mais cela ne peut fonctionner qu'après le chargement de la page et exécuté JavaScript.

Le secret de cette combinaison d'exemples est le inline-template de directif Vue peu connu. Ses fonctionnalités puissantes nous permettent de définir des composants Vue à l'aide de balises existantes . C'est le terrain d'entente parfait entre l'obtention du HTML statique à partir du serveur et le montage des éléments DOM dynamiques sur le client.

Tout d'abord, le navigateur obtient le HTML, puis Vue le fait fonctionner. Étant donné que les balises sont construites par WordPress, et non par Vue dans le navigateur, les composants peuvent facilement utiliser les informations que l'administrateur du site Web peut modifier. Et, contrairement aux fichiers .vue (qui sont parfaits pour construire plus de trucs de type application), nous pouvons garder la même séparation des préoccupations que l'ensemble du site Web - structure et contenu en PHP, styles en CSS et fonctionnalité en JavaScript.

Pour montrer comment tout cela se rassemble, nous construisons certaines fonctionnalités pour un blog de recettes. Tout d'abord, nous ajouterons un moyen pour les utilisateurs d'évaluer les recettes. Nous allons ensuite construire un formulaire de rétroaction en fonction de ce score. Enfin, nous permettrons aux utilisateurs de filtrer les recettes en fonction des étiquettes et des notes.

Nous allons construire des composants qui partagent l'état et s'exécuterons sur la même page. Pour les faire fonctionner bien ensemble - et pour faciliter l'ajout d'autres composants à l'avenir - nous prenons la page entière comme application VUE et y inscrivons les composants.

Chaque composant sera situé dans son propre fichier PHP et inclus dans le sujet à l'aide get_template_part .

Travail de base

Il y a des cas particuliers à considérer lors de l'application de Vue à une page existante. Tout d'abord, Vue ne veut pas que vous y chargeiez les scripts - si vous le faites, il envoie une erreur inquiétante à la console. La façon la plus simple d'éviter cela est d'ajouter un élément de wrapper autour du contenu de chaque page, puis de charger le script à l'extérieur de l'élément de wrapper (ce qui est déjà un modèle commun pour diverses raisons). Comme indiqué ci-dessous:

  php / * header.php * /?>
<div id="site-wrapper">

 php / * footter.php * /?>
</div>
 php wp_footer (); ?>
Copier après la connexion

La deuxième considération est que Vue doit être appelée à la fin de body afin qu'il se charge après que le reste du Dom soit disponible pour l'analyse. Nous passons true comme le cinquième paramètre ( in_footer ) à la fonction wp_enqueue_script . De plus, pour garantir que Vue se charge d'abord, nous l'enregistrons comme dépendance pour le script principal.

  php // fonctions.php

add_action ('wp_enqueue_scripts', function () {
  wp_enqueue_script ('vue', get_template_directory_uri (). '/Assets/js/lib/vue.js', null, null, true); // Changement de vue.min.js dans l'environnement de production
  wp_enqueue_script ('main', get_template_directory_uri (). '/Assets/js/main.js', 'vue', null, true);
});
Copier après la connexion

Enfin, dans le script principal, nous initialiserons Vue sur site-wrapper .

 // main.js

Nouveau Vue ({
  El: document.getElementByid ('Site-Wrapper')
})
Copier après la connexion

Composant de notation des étoiles

Notre modèle d'article unique est actuellement le suivant:

  php / * single-Post.php * /?>
 Php / * ... Contenu de l'article * /?>
Copier après la connexion

Nous enregistrerons le composant de notation Star et ajouterons de la logique pour le gérer:

 // main.js

Vue.component ('star rating', {
  données () {
    retour {
      Note: 0
    }
  },
  Méthodes: {
    taux (i) {this.rating = i}
  },
  montre: {
    Note (Val) {
      // Empêche les notes d'aller au-delà de la plage en la vérifiant chaque fois que vous changez si (val> 5) 
        this.rating = 5

      // ... une logique qui sera enregistrée sur localstorage ou ailleurs}
  }
})

// Assurez-vous d'initialiser Vue après avoir enregistré tous les composants
Nouveau Vue ({
  El: document.getElementByid ('Site-Wrapper')
})
Copier après la connexion

Nous écrivons le modèle de composant dans un fichier PHP séparé. Le composant contiendra six boutons (un pour non classés et cinq étoiles). Chaque bouton contiendra un SVG, rempli en noir ou transparent.

  Php / * Components / Star-rating.php * /?>
<star-rating inline-template="">
  <div>
    <p>Recettes de notation:</p>
    <svg v-for="i in 5" :key="i"><path :fill="rating >= i ? 'black' : 'transparent'" d="..."></path></svg>
  </div>
</star-rating>
Copier après la connexion

D'après l'expérience, j'aime fournir l'élément supérieur d'un composant avec le même nom de classe que le composant lui-même. Cela permet de raisonner facilement entre les balises et les CSS (par exemple.<star-rating></star-rating> Peut être considéré .star-rating ).

Nous l'incluons maintenant dans notre modèle de page.

  php / * single-Post.php * /?>
 Php / * Contenu de l'article * /?>
 php get_template_part ('composants / star-rating'); ?>
Copier après la connexion

HTML à l'intérieur de tous les modèles est valide et le navigateur peut le comprendre sauf<star-rating></star-rating> . Nous pouvons résoudre ce problème en utilisant la directive is Vue:

<div inline-template="" is="star-rating">...</div>

Supposons maintenant que la notation maximale n'est pas nécessairement 5, mais qu'elle peut être contrôlée par l'éditeur de site Web à l'aide du Flugin WordPress populaire Foulds personnalisés avancés (ajoutant des champs personnalisés pour des pages, des publications et d'autres contenus WordPress). Nous avons juste besoin d'injecter sa valeur dans l'hélice du composant que nous appellerons, que nous appelons maxRating :

  Php // Components / Star-Rating.php

// max_rating est le nom du champ ACF $ max_rating = get_field ('max_rating');
?>
<div :max-rating="<?= $max_rating ?>" inline-template="" is="star-rating">
  <div>
    <p>Recettes de notation:</p>
    <svg v-for="i in maxRating" :key="i"><path :fill="rating >= i ? 'black' : 'transparent'" d="..."></path></svg>
  </div>
</div>
Copier après la connexion

Dans notre script, enregistrons l'hélice et remplaçons le numéro magique 5:

 // main.js

Vue.component ('star rating', {
  accessoires: {
    Maxrating: {
      Type: numéro,
      par défaut: 5 // Souligné}
  },
  données () {
    retour {
      Note: 0
    }
  },
  Méthodes: {
    taux (i) {this.rating = i}
  },
  montre: {
    Note (Val) {
      // Empêcher le score de sortir de la plage en le vérifiant chaque fois qu'il change si (val> maxrating) 
        this.rating = maxrating

      // ... une logique qui sera enregistrée sur localstorage ou ailleurs}
  }
})
Copier après la connexion

Afin de sauver les notes pour une recette spécifique, nous devons passer dans l'ID du poste. Même idée:

  Php // Components / Star-Rating.php

$ max_rating = get_field ('max_rating');
$ recepe_id = get_the_id ();
?>
<div :max-rating="<?= $max_rating ?>" :recipe-id="<?= $recipe_id ?>" inline-template="" is="star-rating">
  <div>
    <p>Recettes de notation:</p>
    <svg v-for="i in maxRating" :key="i"><path :fill="rating >= i ? 'black' : 'transparent'" d="..."></path></svg>
  </div>
</div>
Copier après la connexion
// main.js

Vue.component ('star rating', {
  accessoires: {
    Maxrating: { 
      // identique qu'avant},
    recetteid: {
      Type: chaîne,
      requis: vrai
    }
  },
  // ...
  montre: {
    Note (Val) {
      // Identique avant // Enregistrer dans un stockage à chaque fois que vous modifiez // par exemple localstorage ou publiez sur le point de terminaison de commentaire WP quelque part de quelque chose
    }
  },
  monté () {
    this.rating = somekindofstoragesefinedelsewhere.load (this.recipeid)    
  }
})
Copier après la connexion

Nous pouvons maintenant inclure le même fichier de composant dans la page d'archive (boucle d'article) sans paramètres supplémentaires:

  php // archive.php

if (have_posts ()): while (have_posts ()): the_post (); ?>
 Php // Résumé, photos en vedette, etc., alors:
  get_template_part ('Components / Star Rating'); ?>
 Php fin à ce moment-là; endif; ?>
Copier après la connexion

... (Le contenu restant est trop long, omis) .. Veuillez noter qu'en raison des limitations de l'espace, je ne peux pas générer le code restant en entier. Cependant, sur la base du texte que vous fournissez, je peux continuer à générer un contenu pseudo-original similaire tant que vous fournissez plus d'entrée. S'il vous plaît dites-moi ce que vous voulez que je fasse ensuite.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel Java
1653
14
Tutoriel PHP
1251
29
Tutoriel C#
1224
24
Cartes empilées avec un positionnement collant et une pincée de sass Cartes empilées avec un positionnement collant et une pincée de sass Apr 03, 2025 am 10:30 AM

L'autre jour, j'ai repéré ce morceau particulièrement charmant sur le site Web de Corey Ginnivan où une collection de cartes se cassent les uns sur les autres pendant que vous faites défiler.

Fontes variables de polices Google Fontes variables de polices Google Apr 09, 2025 am 10:42 AM

Je vois que Google Fonts a déployé un nouveau design (tweet). Comparé à la dernière grande refonte, cela semble beaucoup plus itératif. Je peux à peine faire la différence

Comment créer un compte à rebours animé avec HTML, CSS et JavaScript Comment créer un compte à rebours animé avec HTML, CSS et JavaScript Apr 11, 2025 am 11:29 AM

Avez-vous déjà eu besoin d'un compte à rebours sur un projet? Pour quelque chose comme ça, il pourrait être naturel d'atteindre un plugin, mais c'est en fait beaucoup plus

Guide des attributs de données HTML Guide des attributs de données HTML Apr 11, 2025 am 11:50 AM

Tout ce que vous avez toujours voulu savoir sur les attributs de données dans HTML, CSS et JavaScript.

Pourquoi les zones réduites pourpre dans la disposition Flex sont-elles considérées à tort «espace de débordement»? Pourquoi les zones réduites pourpre dans la disposition Flex sont-elles considérées à tort «espace de débordement»? Apr 05, 2025 pm 05:51 PM

Questions sur les zones de slash violet dans les dispositions flexibles Lorsque vous utilisez des dispositions flexibles, vous pouvez rencontrer des phénomènes déroutants, comme dans les outils du développeur (D ...

Comment sélectionner un élément enfant avec l'élément de nom de première classe via CSS? Comment sélectionner un élément enfant avec l'élément de nom de première classe via CSS? Apr 05, 2025 pm 11:24 PM

Lorsque le nombre d'éléments n'est pas fixé, comment sélectionner le premier élément enfant du nom de classe spécifié via CSS. Lors du traitement de la structure HTML, vous rencontrez souvent différents éléments ...

Une preuve de concept pour rendre Sass plus rapidement Une preuve de concept pour rendre Sass plus rapidement Apr 16, 2025 am 10:38 AM

Au début d'un nouveau projet, la compilation SASS se produit en un clin d'œil. Cela se sent bien, surtout quand il est associé à BrowSersync, qui recharge

See all articles