Node.js

WP REST API İle Post Listeleme ve Kategori İsimleri

Güncelleme:
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 ...
GÖRSEL

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>.

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ğım.

---
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ı Başlığı
 
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 REST API ve Postların Kategori İsimleri İle Listelenmesi

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 kancası ve register_rest_field 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ım.

/ceaksan/wp-posts-markdown-files-w-nodejs/snippets/1986435
1
2
3
4
5
6
7
8
9
10
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şturabiliriz.

/ceaksan/wp-posts-markdown-files-w-nodejs/snippets/1986435
11
12
13
14
15
16
17
18
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ılabilirsiniz.

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.

/ceaksan/wp-posts-markdown-files-w-nodejs/-/blob/master/EXAMPLE.env
1
2
3
4
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.

/ceaksan/wp-posts-markdown-files-w-nodejs/-/blob/master/wpQuery.js
1
2
3
4
5
6
7
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.

İleri Okumalar
Kaynakça
  1. “Theme Functions”, WordPress.org Theme Handbook.
  2. “Functions File Explained”, WordPress.org
  3. “register_rest_field()”, WordPress.org
  4. “rest_api_init”, WordPress.org
Ceyhun Enki Aksan

Kullanıcı Davranışları Analizi (User Behavior Analysis) ve Kullanıcı Deneyim Tasarımı (UX Design) üzerine çalışmalar yürütmekte, bu süreçte edindiğim teknik ve pratik bilgileri fayda sağlamak motivasyonuyla (afaik / as far as i know) paylaşmaktayım.

HABERDAR OL

Yeni eklenen projeler, eğitimler, içerikler ve yayınlanan videolar e-posta adresine gelsin.