Compare commits
6 Commits
v0.1.5
...
c5ce607fae
| Author | SHA1 | Date | |
|---|---|---|---|
| c5ce607fae | |||
| 9cd99c36db | |||
| 108269e3fe | |||
| 4492d760bb | |||
| 489ac82faa | |||
| d7cf08db00 |
@@ -32,12 +32,14 @@
|
||||
"lintfix": "vendor/bin/phpcbf"
|
||||
},
|
||||
"require": {
|
||||
"axepress/wp-graphql-rank-math": "*",
|
||||
"lewebsimple/advanced-custom-fields-pro": "*",
|
||||
"lewebsimple/kaliroots": "*",
|
||||
"lewebsimple/wp-graphql-headless-login": "*",
|
||||
"wpackagist-plugin/acf-extended": "*",
|
||||
"wpackagist-plugin/clean-image-filenames": "*",
|
||||
"wpackagist-plugin/disable-comments": "*",
|
||||
"wpackagist-plugin/seo-by-rank-math": "*",
|
||||
"wpackagist-plugin/wp-graphql": "*",
|
||||
"wpackagist-plugin/wpgraphql-acf": "*"
|
||||
},
|
||||
|
||||
181
composer.lock
generated
181
composer.lock
generated
@@ -4,8 +4,169 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "aec2b0e396a71ea02fe95432358ca91e",
|
||||
"content-hash": "9673ea7f3e3f21866ae50f70e1d6a16b",
|
||||
"packages": [
|
||||
{
|
||||
"name": "axepress/wp-graphql-plugin-boilerplate",
|
||||
"version": "0.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/AxeWP/wp-graphql-plugin-boilerplate.git",
|
||||
"reference": "09495b61346453baabdf4c71a38ada3cfc91c3a7"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/AxeWP/wp-graphql-plugin-boilerplate/zipball/09495b61346453baabdf4c71a38ada3cfc91c3a7",
|
||||
"reference": "09495b61346453baabdf4c71a38ada3cfc91c3a7",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.4"
|
||||
},
|
||||
"require-dev": {
|
||||
"axepress/wp-graphql-cs": "^2.0.0",
|
||||
"axepress/wp-graphql-stubs": "^2.3.0",
|
||||
"phpcompatibility/php-compatibility": "dev-develop as 9.9.9",
|
||||
"phpstan/extension-installer": "^1.1",
|
||||
"phpstan/phpstan": "^2.0",
|
||||
"phpstan/phpstan-deprecation-rules": "^2.0.1",
|
||||
"szepeviktor/phpstan-wordpress": "^2.0",
|
||||
"wp-cli/wp-cli-bundle": "^2.8.1"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"AxeWP\\GraphQL\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"GPL-3.0-or-later"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "AxePress Development",
|
||||
"homepage": "https://axepress.dev"
|
||||
},
|
||||
{
|
||||
"name": "David Levine",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "Boilerplate for creating WPGraphQL extensions",
|
||||
"support": {
|
||||
"issues": "https://github.com/AxeWP/wp-graphql-plugin-boilerplate/issues",
|
||||
"source": "https://github.com/AxeWP/wp-graphql-plugin-boilerplate/tree/0.1.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/AxeWp",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2025-06-07T02:03:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "axepress/wp-graphql-rank-math",
|
||||
"version": "0.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/AxeWP/wp-graphql-rank-math.git",
|
||||
"reference": "167bdd4a5350717ed34069c304e0ffc3fe02bc7d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/AxeWP/wp-graphql-rank-math/zipball/167bdd4a5350717ed34069c304e0ffc3fe02bc7d",
|
||||
"reference": "167bdd4a5350717ed34069c304e0ffc3fe02bc7d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"axepress/wp-graphql-plugin-boilerplate": "^0.1.1",
|
||||
"php": ">=7.4"
|
||||
},
|
||||
"require-dev": {
|
||||
"axepress/wp-graphql-cs": "^2.0.0",
|
||||
"axepress/wp-graphql-stubs": "^2.0.0",
|
||||
"codeception/lib-innerbrowser": "^1.0",
|
||||
"codeception/module-asserts": "^1.0",
|
||||
"codeception/module-cli": "^1.0",
|
||||
"codeception/module-db": "^1.0",
|
||||
"codeception/module-filesystem": "^1.0",
|
||||
"codeception/module-phpbrowser": "^1.0",
|
||||
"codeception/module-rest": "^2.0",
|
||||
"codeception/module-webdriver": "^1.0",
|
||||
"codeception/phpunit-wrapper": "^9.0",
|
||||
"codeception/util-universalframework": "^1.0",
|
||||
"lucatume/wp-browser": "<3.5",
|
||||
"php-coveralls/php-coveralls": "^2.5",
|
||||
"phpcompatibility/php-compatibility": "dev-develop as 9.9.9",
|
||||
"phpstan/extension-installer": "^1.1",
|
||||
"phpstan/phpstan": "^2.1.5",
|
||||
"phpunit/phpunit": "^9.5",
|
||||
"szepeviktor/phpstan-wordpress": "^2.0.1",
|
||||
"wp-cli/wp-cli-bundle": "^2.8.1",
|
||||
"wp-graphql/wp-graphql-testcase": "~3.4.0"
|
||||
},
|
||||
"type": "wordpress-plugin",
|
||||
"extra": {
|
||||
"strauss": {
|
||||
"packages": [
|
||||
"axepress/wp-graphql-plugin-boilerplate"
|
||||
],
|
||||
"classmap_prefix": "WPGraphQL_RankMath_",
|
||||
"constant_prefix": "WPGRAPHQL_SEO_",
|
||||
"namespace_prefix": "WPGraphQL\\RankMath\\Vendor\\",
|
||||
"target_directory": "vendor-prefixed",
|
||||
"update_call_sites": false,
|
||||
"exclude_from_prefix": {
|
||||
"namespaces": [],
|
||||
"file_patterns": []
|
||||
},
|
||||
"include_modified_date": false,
|
||||
"delete_vendor_packages": true
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"access-functions.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"WPGraphQL\\RankMath\\": "src/"
|
||||
},
|
||||
"classmap": [
|
||||
"vendor-prefixed/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"GPL-3.0-or-later"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "AxePress Development",
|
||||
"email": "support@axepress.dev",
|
||||
"homepage": "https://axepress.dev"
|
||||
},
|
||||
{
|
||||
"name": "David Levine",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "Adds WPGraphQL support for RankMath SEO",
|
||||
"support": {
|
||||
"email": "support@axepress.dev",
|
||||
"forum": "https://github.com/AxeWP/wp-graphql-rank-math/discussions",
|
||||
"issues": "https://github.com/AxeWP/wp-graphql-rank-math/issues",
|
||||
"source": "https://github.com/AxeWP/wp-graphql-rank-math/tree/0.3.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/sponsors/AxeWP",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2025-06-07T12:05:15+00:00"
|
||||
},
|
||||
{
|
||||
"name": "composer/installers",
|
||||
"version": "v2.3.0",
|
||||
@@ -257,6 +418,24 @@
|
||||
"type": "wordpress-plugin",
|
||||
"homepage": "https://wordpress.org/plugins/disable-comments/"
|
||||
},
|
||||
{
|
||||
"name": "wpackagist-plugin/seo-by-rank-math",
|
||||
"version": "1.0.262",
|
||||
"source": {
|
||||
"type": "svn",
|
||||
"url": "https://plugins.svn.wordpress.org/seo-by-rank-math/",
|
||||
"reference": "tags/1.0.262"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://downloads.wordpress.org/plugin/seo-by-rank-math.1.0.262.zip"
|
||||
},
|
||||
"require": {
|
||||
"composer/installers": "^1.0 || ^2.0"
|
||||
},
|
||||
"type": "wordpress-plugin",
|
||||
"homepage": "https://wordpress.org/plugins/seo-by-rank-math/"
|
||||
},
|
||||
{
|
||||
"name": "wpackagist-plugin/wp-graphql",
|
||||
"version": "2.6.0",
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
# Moonshine
|
||||
|
||||
Headless WordPress theme based on Nuxt.
|
||||
Thème WordPress en headless basé sur Nuxt.
|
||||
|
||||
## Varaibles d'environnement
|
||||
|
||||
| Nom | Description | Exemple | Requise |
|
||||
|-----|-------------|---------|---------|
|
||||
| `NUXT_SESSION_PASSWORD` | Clé secrète pour l'authentification | `date \| md5sum` | ✅ |
|
||||
| `NUXT_WP_URL` | URL du backend WordPress | https://wp.exemple.com | ✅ |
|
||||
| `NUXT_SITE_URL` | URL du frontend Nuxt | https://www.example.com | ➖ |
|
||||
| `NUXT_SITE_ENV` | Environnement | staging \| production | ➖ |
|
||||
|
||||
60
wp-content/themes/moonshine/acf-json/group_options_site.json
Normal file
60
wp-content/themes/moonshine/acf-json/group_options_site.json
Normal file
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"key": "group_options_site",
|
||||
"title": "Options - Site",
|
||||
"fields": [
|
||||
{
|
||||
"key": "field_697220310aaaf",
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"aria-label": "",
|
||||
"type": "email",
|
||||
"instructions": "",
|
||||
"required": 1,
|
||||
"conditional_logic": 0,
|
||||
"wrapper": {
|
||||
"width": "",
|
||||
"class": "",
|
||||
"id": ""
|
||||
},
|
||||
"default_value": "",
|
||||
"allow_in_bindings": 0,
|
||||
"placeholder": "",
|
||||
"prepend": "",
|
||||
"append": "",
|
||||
"show_in_graphql": 1,
|
||||
"graphql_description": "",
|
||||
"graphql_field_name": "email",
|
||||
"graphql_non_null": 1
|
||||
}
|
||||
],
|
||||
"location": [
|
||||
[
|
||||
{
|
||||
"param": "options_page",
|
||||
"operator": "==",
|
||||
"value": "site-options"
|
||||
}
|
||||
]
|
||||
],
|
||||
"menu_order": 0,
|
||||
"position": "normal",
|
||||
"style": "seamless",
|
||||
"label_placement": "top",
|
||||
"instruction_placement": "label",
|
||||
"hide_on_screen": "",
|
||||
"active": true,
|
||||
"description": "",
|
||||
"show_in_rest": 0,
|
||||
"display_title": "",
|
||||
"acfe_autosync": [
|
||||
"json"
|
||||
],
|
||||
"acfe_form": 0,
|
||||
"show_in_graphql": 1,
|
||||
"graphql_field_name": "GroupSite",
|
||||
"map_graphql_types_from_location_rules": 0,
|
||||
"graphql_types": "",
|
||||
"acfe_meta": "",
|
||||
"acfe_note": "",
|
||||
"modified": 1769087407
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"key": "ui_options_page_site",
|
||||
"title": "Options du site",
|
||||
"active": true,
|
||||
"menu_order": 0,
|
||||
"page_title": "Options du site",
|
||||
"menu_slug": "site-options",
|
||||
"parent_slug": "options-general.php",
|
||||
"advanced_configuration": 1,
|
||||
"icon_url": "",
|
||||
"menu_title": "",
|
||||
"position": "",
|
||||
"redirect": false,
|
||||
"description": "",
|
||||
"menu_icon": [],
|
||||
"update_button": "Mise à jour",
|
||||
"updated_message": "Options mises à jours",
|
||||
"capability": "edit_posts",
|
||||
"data_storage": "options",
|
||||
"post_id": "",
|
||||
"autoload": 0,
|
||||
"show_in_graphql": 1,
|
||||
"graphql_type_name": "OptionsSite",
|
||||
"modified": 1769086997
|
||||
}
|
||||
20
wp-content/themes/moonshine/app/composables/useNodeSeo.ts
Normal file
20
wp-content/themes/moonshine/app/composables/useNodeSeo.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import type { NodeByUriQueryResult, NodeSeoFragment } from "#graphql/operations";
|
||||
|
||||
export function useNodeSeo(node: NodeByUriQueryResult["nodeByUri"]) {
|
||||
// Check if node has SEO data
|
||||
if (!node || !("seo" in node) || !node.seo) {
|
||||
return;
|
||||
}
|
||||
const { seo } = node as NodeSeoFragment;
|
||||
|
||||
useSeoMeta({
|
||||
title: seo?.title || undefined,
|
||||
description: seo?.description || undefined,
|
||||
robots: (seo?.robots || []).join(", "),
|
||||
ogTitle: seo?.openGraph?.title || undefined,
|
||||
ogDescription: seo?.openGraph?.description || undefined,
|
||||
ogImage: seo?.openGraph?.image?.url || undefined,
|
||||
ogUrl: seo?.canonicalUrl || undefined,
|
||||
twitterCard: "summary_large_image",
|
||||
});
|
||||
}
|
||||
@@ -13,7 +13,7 @@ login( input: { provider: PASSWORD, credentials: { username: $username, password
|
||||
authToken
|
||||
refreshToken
|
||||
user {
|
||||
...AuthUser
|
||||
... AuthUser
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
fragment GeneralSettings on GeneralSettings {
|
||||
title
|
||||
description
|
||||
}
|
||||
|
||||
query GeneralSettings {
|
||||
generalSettings {
|
||||
title
|
||||
description
|
||||
... GeneralSettings
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,27 @@
|
||||
fragment NodeSeo on NodeWithRankMathSeo {
|
||||
seo {
|
||||
title
|
||||
description
|
||||
robots
|
||||
canonicalUrl
|
||||
openGraph {
|
||||
title
|
||||
description
|
||||
image {
|
||||
url
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
query NodeByUri($uri: String!) {
|
||||
nodeByUri(uri: $uri) {
|
||||
__typename
|
||||
... on Page {
|
||||
... NodePage
|
||||
}
|
||||
... on NodeWithRankMathSeo {
|
||||
... NodeSeo
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
fragment SiteOptions on GroupSite_Fields {
|
||||
email
|
||||
}
|
||||
|
||||
query OptionsSite {
|
||||
optionsSite {
|
||||
groupSite {
|
||||
... SiteOptions
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
// Resolve Node component from URI
|
||||
const { path: uri } = useRoute();
|
||||
const { data } = await useAsyncGraphQLQuery("NodeByUri", { uri });
|
||||
|
||||
// Resolve and validate Node component
|
||||
if (!data.value.nodeByUri) {
|
||||
throw createError({ statusCode: 404, message: `La page demandée est introuvable: ${uri}`, fatal: true });
|
||||
}
|
||||
@@ -10,10 +9,13 @@ const componentName = `Node${data.value.nodeByUri.__typename}`;
|
||||
if (!useNuxtApp().vueApp.component(componentName)) {
|
||||
throw createError({ statusCode: 404, message: `La page demandée ne peut pas être affichée correctement: ${componentName}`, fatal: true });
|
||||
}
|
||||
|
||||
useNodeSeo(data.value.nodeByUri);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="data.nodeByUri" id="page-node-from-uri">
|
||||
<Component :is="componentName" v-bind="data.nodeByUri" />
|
||||
<pre>{{ data.nodeByUri }}</pre>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -4,4 +4,5 @@
|
||||
require_once __DIR__ . '/includes/core/theme-setup.php';
|
||||
|
||||
// Vendors
|
||||
require_once __DIR__ . '/includes/vendors/acf.php';
|
||||
require_once __DIR__ . '/includes/vendors/tinymce.php';
|
||||
|
||||
@@ -16,3 +16,18 @@ function moonshine_after_setup_theme() {
|
||||
|
||||
// Register sidebars
|
||||
}
|
||||
|
||||
// Bypass headless home URL for specific cases
|
||||
add_filter( 'home_url', 'moonshine_bypass_home_url', 10, 4 );
|
||||
function moonshine_bypass_home_url( $url, $path, $orig_scheme, $blog_id ) {
|
||||
$excluded_patterns = array(
|
||||
'#/wp-json(/|$)#i', // WP REST API
|
||||
'#\.(xsl|xml)$#i', // Sitemap and XSLT files
|
||||
);
|
||||
foreach ( $excluded_patterns as $pattern ) {
|
||||
if ( preg_match( $pattern, $url ) ) {
|
||||
return get_site_url( $blog_id, $path, $orig_scheme );
|
||||
}
|
||||
}
|
||||
return $url;
|
||||
}
|
||||
|
||||
15
wp-content/themes/moonshine/includes/vendors/acf.php
vendored
Normal file
15
wp-content/themes/moonshine/includes/vendors/acf.php
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
// Disable ACF / ACFE modules
|
||||
add_filter( 'acf/settings/enable_post_types', '__return_false' );
|
||||
add_action( 'acf/init', 'moonshine_acf_init' );
|
||||
function moonshine_acf_init() {
|
||||
acf_update_setting( 'acfe/modules/block_types', false );
|
||||
acf_update_setting( 'acfe/modules/categories', false );
|
||||
acf_update_setting( 'acfe/modules/forms', false );
|
||||
acf_update_setting( 'acfe/modules/options', false );
|
||||
acf_update_setting( 'acfe/modules/options_pages', false );
|
||||
acf_update_setting( 'acfe/modules/post_types', false );
|
||||
acf_update_setting( 'acfe/modules/taxonomies', false );
|
||||
acf_update_setting( 'acfe/modules/templates', false );
|
||||
}
|
||||
@@ -44,20 +44,18 @@ export default defineNuxtConfig({
|
||||
},
|
||||
|
||||
graphql: {
|
||||
yoga: {
|
||||
server: {
|
||||
context: ["~~/server/graphql/context"],
|
||||
schemas: {
|
||||
schema: {
|
||||
wp: {
|
||||
type: "remote",
|
||||
url: `${process.env.NUXT_WP_URL || "https://wp-headless.ledevsimple.ca"}/graphql`,
|
||||
endpoint: `${process.env.NUXT_WP_URL || "https://wp-headless.ledevsimple.ca"}/graphql`,
|
||||
hooks: ["~~/server/graphql/wp-hooks"],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
sitemap: {
|
||||
zeroRuntime: true,
|
||||
},
|
||||
sitemap: false,
|
||||
|
||||
});
|
||||
|
||||
@@ -16,24 +16,24 @@
|
||||
"typecheck": "nuxt typecheck"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iconify-json/lucide": "^1.2.86",
|
||||
"@lewebsimple/nuxt-graphql": "^0.5.10",
|
||||
"@iconify-json/lucide": "^1.2.87",
|
||||
"@lewebsimple/nuxt-graphql": "^0.5.13",
|
||||
"@nuxt/ui": "4.3.0",
|
||||
"@nuxtjs/seo": "^3.3.0",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"nuxt": "^4.2.2",
|
||||
"nuxt": "^4.3.0",
|
||||
"nuxt-auth-utils": "^0.5.27",
|
||||
"tailwindcss": "^4.1.18",
|
||||
"vue": "^3.5.27",
|
||||
"vue-router": "^4.6.4",
|
||||
"zod": "^4.3.5"
|
||||
"zod": "^4.3.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nuxt/eslint": "^1.12.1",
|
||||
"@nuxt/eslint": "^1.13.0",
|
||||
"changelogen": "^0.6.2",
|
||||
"eslint": "^9.39.2",
|
||||
"typescript": "^5.9.3",
|
||||
"vue-tsc": "^3.2.2"
|
||||
"vue-tsc": "^3.2.4"
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
|
||||
1788
wp-content/themes/moonshine/pnpm-lock.yaml
generated
1788
wp-content/themes/moonshine/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user