SEO-оптимизация проекта на Vue/Nuxt с использованием WordPress REST API
WordPress и VueJS/NuxtJS - инструкция по SEO
Этот туториал очень просто демонстрирует, как можно было бы использовать Yoast Seo Plugin для WordPress, чтобы получить SEO-заголовок и Meta-данные во фронтенд VueJS/NuxtJS через WordPress REST API.
В этом пазле несколько кусочков и я постараюсь как можно понятнее, не занимая много времени, объяснить каждый кусочек, в достаточных, не очень трудоемких деталях.
Я создал простейший пример, чтобы продемонстрировать, как это работает, но вам понадобится гораздо больше, чтобы все это работало гладко в production-версии вашего проекта, про это я кратко коснусь в конце.
Мы пройдем через следующие шаги:
- Установим VueJS (NuxtJS) фронтенда для отображения отдельных постов
- Настроим WordPress API, чтобы получать данные поста через эндпоинт RESTful API
- Добавим Yoast SEO плагин в этот эндпоинт
- Подключим фронтенд VueJS к API чтобы получить данные поста и SEO мета-дату
В этом туториале предполагается следующее:
- Промежуточное знание разработки WordPress (PHP)
- Понимание разработки Javascript и некоторые моменты из того, что с этим связано: NPM и т. д
- Небольшое знакомство с SEO-плагином Yoast для WordPress
- Интерес к использованию VueJS
Установим VueJS (NuxtJS) фронтенда для отображения отдельных постов
Выберите каталог на вашем компьютере и создайте новый nuxt проект вот так:
npx create-nuxt-app <project-name>
Следуйте инструкциям и настройте его, как вы хотите — я пошел с NPM без Yarn, без проверки на ошибки, без тестов.
Выполните следующие действия, чтобы увидеть свой сайт на: http://localhost:3000
npm run dev
И вуаля - вы увидите, как работает ваш замечательный новый проект!
После этого вам нужно будет перейти в каталог “pages” и создать новую папку под названием “post”. Внутри этой папки создайте два файла: index.vue и _id.vue.
Индексный файл будет использоваться для отображения страницы списка постов, которые мы не будем рассматривать в этом учебнике, и _id.vue будет использоваться для отображения отдельных постов.
В ' _id.vue ' теперь добавьте следующий код:
<template> <section class="container"> <div> <logo/> <h1 class="title"> Static Post Title </h1> <span class="content"> Static Post Content </span> </div> </section> </template> <script> export default {} </script> <style> .container { min-height: 100vh; display: flex; justify-content: center; align-items: center; text-align: center; } .title { font-family: 'Quicksand', 'Source Sans Pro', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; display: block; font-weight: 300; font-size: 100px; color: #35495e; letter-spacing: 1px; } </style>
Затем посетите эту страницу: http://localhost:3000/post/1
И мы получаем прекрасный маленький шаблон поста, показывающий одни и те же статические данные снова и снова, независимо от того, какой идентификатор вводится в URL-адрес.
Далее мы настроим WordPress API, который подгружает данные поста
Я устанавливаю WP локально через Docker, но это полностью ваш выбор, как вы хотите выполнить установку. После того, как вы настроили сайт, мы работаем с WordPress Rest API для обслуживания данных поста — с некоторыми дополнительными метаданными SEO с помощью SEO-плагина Yoast.
WordPress по умолчанию предоставляет конечную точку API для постов.
Вы можете посетить адрес: http://localhost/wp-json/wp/v2/posts/POST_ID
Мой адрес выглядит так: http://devapi.seotest.com:20080/wp-json/wp/v2/posts/1
Это приведет к ответу, который выглядит примерно следующим образом:
{ "id":1, "date":"2019-01-03T09:54:21", "date_gmt":"2019-01-03T09:54:21", "guid":{ "rendered":"http://devapi.seotest.com:20080/?p=1" }, "modified":"2019-01-03T09:54:21", "modified_gmt":"2019-01-03T09:54:21", "slug":"test-post-seo", "status":"publish", "type":"post", "link":"http://devapi.seotest.com:20080/test-post-seo/", "title":{ "rendered":"My test Post for SEO" }, "content":{ "rendered":"<p>My test post main body content – ain’t that nice!</p>\n", "protected":false }........
Вот так! У вас есть настройка конечной точки API, которая возвращает данные поста, и вам даже не нужно было писать какой-либо код!
Добавим SEO-данные для этих постов
Следующая часть также довольно прямолинейна. Нужно добавить seo-метаданные Yoast к этому ответу.
Перво - наперво - посетите страницу плагинов и установите плагин Yoast SEO
Я собираюсь сосредоточиться только на названии и мета-описании, чтобы этот пост не стал слишком длинным, но остальные поля следуют очень похожей схеме.
Добавьте следующий код в свои functions.php:
add_action( 'rest_api_init', 'slug_register_yoast_seo_meta' ); function slug_register_yoast_seo_meta() { register_rest_field( 'post', '_yoast_wpseo_title', array( 'get_callback' => 'get_seo_meta_field', 'update_callback' => null, 'schema' => null, ) ); register_rest_field( 'post', '_yoast_wpseo_metadesc', array( 'get_callback' => 'get_seo_meta_field', 'update_callback' => null, 'schema' => null, ) ); } function get_seo_meta_field( $object, $field_name, $request ) { return get_post_meta( $object[ 'id' ], $field_name, true ); }
Это приводит к следующему:
Хуки в функции 'rest_api_init' регистрируют два пользовательских поля. Используем 'rest_api_init' вместо ' init’, чтобы этот код выполнялся только на запросах API, а не на обычных постах...
Указываем функцию обратного вызова для извлечения двух полей как ' get_seo_meta_field’, которая просто принимает идентификатор объекта (в данном случае post) и имя поля (либо ‘_yoast_wpseo_title’, либо ‘_yoast_wpseo_metadesc’) и возвращает значение этого мета-поля поста.
Замечательно! Теперь у нас есть конечная точка API для постов, которая возвращает метаданные Yoast SEO!
Полное описание того, как добавить дополнительные мета-поля в конечные точки, вы можете найти здесь: https://v2.wp-api.org/extending/modifying
Подключите приложение VueJS для извлечения данных поста
Это последний шаг — нам нужно сказать фронтенду Vue, чтобы он извлекал данные поста для каждого поста из API WordPress. Мы делаем это следующим образом:
Мы собираемся использовать Axios для этого, поэтому в вашем _id.vue добавьте следующее в теги <script>.
<script> import axios from 'axios'export default { asyncData ({ params }) { return axios.get(`http://devapi.seotest.com:20080/test-post-seo/wp-json/wp/v2/posts/${params.id}`) .then(response => { return { post: response.data } }) .catch((error) => { return { error: error } }) }, data () { return { post: {}, error: [] } } } </script>
Что здесь будет происходить?
- Мы импортируем Axios в файл
- Мы используем метод Nuxt ‘asyncData ' для выполнения нашего запроса Axios
- Мы используем параметр динамического идентификатора, чтобы получать разные сообщения, посещая разные URL-адреса
- Мы добавляем возвращаемые POST-данные в объект ‘пост’, что мы создали
Теперь мы можем отображать динамический заголовок и динамическое содержимое для нашего поста примерно так:
<template> <section class="container"> <div> <h1 class="title"> {{post.title.rendered}} </h1> <span v-html="post.content.rendered"></span> </div> </section> </template>
Пожалуйста, обратите внимание на:
v-html=”post.content.rendered”
Это форматирует HTML разметку возвращенную красиво и мы должны увидеть что-то вроде следующего:
Конечно, сам контент будет зависеть от того, что вы помещаете в посте, созданное на стороне WordPress, а идентификатор в строке URL будет зависеть от идентификатора этого поста.
Далее мы хотим включить SEO данные следующим образом:
<script> import axios from 'axios'export default { head () { return { title: this.post._yoast_wpseo_title, meta: [ { hid: 'description', id: 'description', name: 'description', content: this.post._yoast_wpseo_metadesc } ] } }, asyncData ({ params }) {
Полный код для файла ниже:
<template> <section class="container"> <div> <h1 class="title"> {{post.title.rendered}} </h1> <span v-html="post.content.rendered"></span> </div> </section> </template> <script> import axios from 'axios'export default { head () { return { title: this.post._yoast_wpseo_title, meta: [ { hid: 'description', id: 'description', name: 'description', content: this.post._yoast_wpseo_metadesc } ] } }, asyncData ({ params }) { return axios.get(`http://devapi.go2africa.com:20080/wp-json/wp/v2/posts/${params.id}`) .then(response => { return { post: response.data } }) .catch((error) => { return { error: error } }) }, data () { return { post: {}, error: [] } } } </script> <style> .container { min-height: 100vh; display: flex; justify-content: center; align-items: center; text-align: center; } .title { font-family: 'Quicksand', 'Source Sans Pro', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; display: block; font-weight: 300; font-size: 100px; color: #35495e; letter-spacing: 1px; } .subtitle { font-weight: 300; font-size: 42px; color: #526488; word-spacing: 5px; padding-bottom: 15px; } .links { padding-top: 15px; } </style>
Это было сделано самым простым из возможных способов - просто чтобы проиллюстрировать, как связать все это вместе. Я упоминаю ниже, как мы на самом деле сделали совсем немного больше, чтобы заставить это работать в production.
Заключение
Ну вот, теперь у тебя есть Vue.JS фронтенд с SEO, предоставляемым SEO-плагином Yoast из бэкенда WordPress!
Вот скриншот нашего примера:
Переведено: IceSlam
Оригинал: NONA-WEB