WP REST API İle Post Listeleme ve Kategori İsimleri
WordPress REST API kullanımıyla ilgili temel bilgiler verdiğim WordPress API Kullanımları başlıklı yazının peşi sıra farklı programlama dilleri aracılığıyla çeşitli örnek işlemler gerçekleştirmiştik.
Bu yazılara WP REST API araması üzerinden ulaşabilirsiniz. Örneklere ek olarak, WordPress Custom Endpoint başlıklı yazıda da nasıl ihtiyaçlarımız doğrultusunda uç nokta oluşturabileceğimizi gördük. Peki, ya var olan bir uç noktaya müdahale etmek istersek?
Bu yazı WordPress İçeriklerin Markdown Olarak Dönüştürülmesi başlıklı yazımın devamı niteliğindedir.
WP REST API ve Yazıların Listelenmesi
WordPress REST API posts
uç noktası ile bize tüm yazılarımıza sayfa başına maksimum 100 adet olacak şekilde erişme imkanı sunmakta. Spesifik bir id
temelinde bilgilere ulaşmak için ise posts
sonrasında post ID
belirtmek yeterli; domain.com/wp-json/wp/v2/posts/<post-id>
.
WP REST API ile ilgili desteğe mi ihtiyacın var? Geliştirme ve ilgili diğer konular için destek talebinde bulunabilirsin.
Yazılarımızın farklı platformlarda kullanılmak üzere markdown formatında kopyalarını oluşturmak istiyoruz. Ben gridsome bağlamında süreci ele alacağım. Yazılarımın yayın tarihi, URI, kısa açıklama, etiket ve kategori tanımlarının bozulmaması için şöyle bir YAML metadata alanı oluşturacağım1.
---
title: Yazının başlığı
date: Yazının oluşturulma tarihi
modified: Yazının son güncellenme tarihi
slug: Yazının URI tanımı
categories: Kategoriler
tags: Etiketler
description: Kısa açıklama
---
Yazının md formatında düzenlenmiş olan içeriği
Yukarıdaki bilgiler için posts
uç noktasına id, date, modified, status, type, slug, content.rendered, excerpt.rendered, title.rendered, categories,tags
parametrelerini kullanarak bir GET sorgusunda bulunabiliriz. Ancak, alacağımız karşılıkta kategori ve etiketler id
olacaktır. Elbette ziyaretçileriniz id
karşılıklarını bilmiyorlarsa bu durum onlar için oldukça anlamsız olacaktır. Peki, neler yapılabilir?
WordPress register_rest_field Fonksiyonu
Eğer WordPress aktif tema dosyalarına müdahale etme imkanımız varsa functions.php
içerisinde rest_api_init
2 kancası ve register_rest_field
3 fonksiyonu aracılığıyla tanımlı WordPress nesne tipi içerisinde yeni bir alan oluşturabiliriz. WordPress nesne tipi her uç noktanın farklı içeriğe sahip olduğu içeriği ifade etmekte. Dolayısıyla, yapacağımız ekleme biz hangi uç nokta(lar) ile ilişkilendirmişsek sadece o uç nokta(lar) üzerinden erişilebilir. Hemen fonksiyonumuzu oluşturmaya başlayalım4.
add_action('rest_api_init', function() {
register_rest_field('posts',
'cat_names',
array(
'get_callback' => 'get_catNames',
'update_callback' => null,
'schema' => null,
)
);
});
İlk olarak add_action
içerisinde rest_api_init
kancasına erişelim ve yapacağımız işlemi belirtelim; register_rest_field
. $object_type
string
veya array
alabiliyor. Kategori isimlerinin farklı uç noktalar üzerinden de erişilebilir olması için bu alanda dizi içerisinde ilgili uç noktaların belirtilmesi gerekli. Örneğin, farklı post tipleriniz var ise bu alanda belirtmeniz uygun olacaktır. Artık get_callback
ile çağırdığımız fonksiyonu oluşturabiliriz5.
function get_catNames($object, $field_name, $request) {
$nameDef = array();
$categories = get_the_category( $object['id'] );
foreach ($categories as $category) {
$nameDef[] = $category->name;
}
return $nameDef;
}
get_callback
fonksiyonu en temel haliyle get_the_category( $object['id'] );
ile ilgili yazının kategorilerine erişebilmemizi sağlıyor. Sonrasında edindiğimiz kategorileri id
değerlerine karşılık $category->name
ile name
değerlerine ulaşabiliyoruz. Yukarıdaki kodun tamamına Wp Posts To Markdown Files W Nodejs snippet olarak ulaşabilirsiniz.
Evet, bu işlem sonrasında domain.com/wp-json/wp/v2/posts/
isteğine verilen yanıt içerisinde cat_names
alanını görebilirsiniz.
Elbette, gereksiz satırlar yerine sadece istediğimiz alanları parametre olarak belirtebiliriz. Kategori ve etiket alanları için name
bilgilerinin döndüğünü varsayarsak, son durumda parametremiz şuna benzeyecektir.
domain.com/wp-json/wp/v2/posts/?_fields=id,date,modified,status,type,slug,content.rendered,excerpt.rendered,title.rendered,cat_names,tag_names
Elbette kategori ve etiket adlarının getirilmesi register_rest_field
ile yapılabilecek oldukça temel bir işlemdi. İhtiyaçlarınıza göre özelleştirilmiş alanlar, öne çıkan görsel ve daha pek çok yazı özelindeki bilgiyi de yine bu fonksiyon sayesinde uç nokta üzerinden ulaşılabilir kılabilirsiniz3 2.
Peki, WordPress aktif temaya ait functions.php
dosyasına müdahale edemiyorsak ne yapacağız?
Node.js ve WP REST API
Yazının başında da belirttiğim gibi, WP REST API üzerinden yazıların listelenmesi işlemini daha önce R programlama dili ile R İle WordPress REST API Erişimi başlıklı yazımda gerçekleştirmiştim. Bu örnek içerisinde posts
ile yazıların listelenmesinin yanı sıra categories
ve tags
uç noktaları üzerinden kategorilerin ve etiketlerin id
ile name
bilgilerini elde etmiş, ardından yazılara ait id
tanımlarını name
tanımları ile güncellemiştim.
Şimdi bu işlemi Node.js ile yeniden ele alabiliriz.
WP Posts to Markdown Files w/ Nodejs
Evet, ilgili uygulamayı git clone git@gitlab.com:ceaksan/wp-posts-markdown-files-w-nodejs.git
ile edinebilir veya buradan repo detaylarına ulaşabilirsiniz. Kodu uygulamadan önce EXAMPLE.env
dosya adını .env
olarak değiştirmeli ve içeriğindeki basic auth
bilgilerini web sitenize ait REST API erişim bilgileri ile güncellemelisiniz. WordPress ön tanımlı olaran sayfa başına 10 kayıt döner. Ancak perpage
ile bu sayı 100 adete kadar çıkarılabilmektedir. .env
içerisinde de bu değer 100 olarak tanımlanmıştır.
BASEURL = "https://domain.com"
PERPAGE = 100 # MAX 100
USERNAME = "******"
PASSWORD = "***********"
wpQuery
modudülü state içerisinde istekte bulunulacak uç noktaları ve bu isteklere dönecek yanıtta yer alacak parametreleri görebilirsiniz. wpQuery
içerisinde istediğiniz kadar uç nokta tanımlayabilir ve bu parametreleri ihtiyaçlarınız doğrultusunda düzenleyebilirsiniz.
let state = {
queryPath : [
{ endpoint : 'posts', params: 'id,date,modified,status,type,slug,content.rendered,excerpt.rendered,title.rendered,categories,tags' },
{ endpoint : 'tags', params: 'id,name,slug' },
{ endpoint : 'categories', params: 'id,name,slug' }
]
}
Bu işlemin sonucunda kategori (categories) ve etiket (tags) tanımları id olarak dönecektir. Şayet, temaya ait functions.php
dosyasında, yukarıdaki başlıkta belirtilen register_rest_field
işlemini yaptıysanız categories
ve tags
parametrelerini cat_names
ve tag_names
olarak düzenleyebilirsiniz. Eğer register_rest_field
işlemini yapamadıysanız transform.js
modülü sizin için kategoriler ve etiketlere ait id
içeriklerini name
karşılıklarını ile güncelleyecektir.
Son olarak, index.js
tüm bu süreci aşamalı olarak ele almaktadır. node index.js
komutu ile içeriklerinizi edinebilir, id
değerlerini name
karşılıkları ile değiştirebilir ve düzenlenmiş bu verileri md
klasörü içerisinde <post_id>_<post_slug>.md
şeklinde isimlendirilmiş olarak yazının ilk bölümünde yer alan YAML metadata tanımları ile birlikte md
formatında edinebilirsiniz.
İşlemlerimiz bu kadar. İlerleyen yazılarda edindiğimiz bu md formatındaki içeriklerimize farklı servisler/platformlar aracılığıyla nasıl erişeceğimize bakacağız.