Uygulamanızı WordPress ile Bağlayarak Python Pirzolalarınızı Parlatın
Yayınlanan: 2022-10-18WordPress, uygulama programlama arayüzü (API) sayesinde en çok kullanılan içerik yönetim sistemi (CMS) haline geldi. WordPress REST API, WordPress'in Python dahil olmak üzere çeşitli dillerde yazılmış diğer uygulamalarla "konuşmasını" sağlar.
Python, çeşitli kullanımları ve insan tarafından okunabilir bir sözdizimi ile genişletilebilir bir programlama dilidir ve bu da onu WordPress içeriğini uzaktan yönetmek için güçlü bir araç haline getirir.
Uygulamalarınız için bazı WordPress REST API kullanım durumları ve bunları desteklemek için Python'u nasıl kullanabileceğinizi aşağıda bulabilirsiniz:
- Uygulamanızın ham verileri hızlı bir şekilde açıklamalarla biçimlendirilmiş gönderilere dönüştürmesini sağlamak için önceden tanımlanmış şablonları kullanın.
- Django ve Python üzerinde, nesneye özel bir indirim veya satış olayı gerçekleştiğinde müşterilerinize sınırlı süreli teklifler görüntüleyen bir arka ofis uygulaması oluşturun.
- WordPress sitenizin içinde çalıştırmak için Python komut dosyalarını entegre edin
Bu eğitim, WordPress REST API'si ile iletişim kuran ve bu API üzerinde işlemler yürüten basit bir Python konsol uygulaması oluşturmanıza yardımcı olacaktır. Tam proje kodu da mevcuttur.
WordPress'i Yükleme ve Yapılandırma
İlk olarak, geliştirme makinenize yerel olarak bir WordPress web sitesi kurup çalıştıralım. Bu, web barındırma için bir hesap oluşturmanız veya bir alan adı satın almanız gerekmediğinden, WordPress'e başlamak için harika bir yoldur.
WordPress'i yerel olarak kurmadan önce, Apache web sunucusu, yerel bir veritabanı ve WordPress'in yazıldığı PHP dili dahil olmak üzere bazı bileşenlerin bilgisayarınızda çalışması gerekir.
Neyse ki, tüm büyük işletim sistemlerinde kullanılabilen ücretsiz bir yerel WordPress geliştirme paketi olan DevKinsta'yı kullanabiliriz (bunu kullanmak için Kinsta müşterisi olmanız gerekmez).
DevKinsta, Windows, Mac ve Linux için kullanılabilir ve WordPress'i ve tüm bağımlılıklarını yerel makinenize yükler.
DevKinsta'yı kurmadan önce, Docker'ın yerel olarak çalışıyor olması gerekir, bu nedenle henüz yapmadıysanız Docker Engine'i indirin ve kurun.
Docker Desktop'ı kurduktan sonra, işletim sisteminize uyan paketi otomatik olarak indirebilirsiniz.
DevKinsta yükleyicisini çalıştırdığınızda, Docker hemen başlatılmaya başlar:
Ardından, Yeni Site Oluştur menüsünden Yeni WordPress sitesi'ni seçin:
Artık DevKinsta yükleyicisi, WordPress yönetici hesabı için kimlik bilgilerini oluşturmanızı gerektiriyor:
Yüklendikten sonra DevKinsta bağımsız bir uygulamadır. Artık hem WordPress sitesine ( Site Aç düğmesi aracılığıyla) hem de WordPress yönetici panosuna ( WP Yönetici düğmesi) erişebilirsiniz.
Ardından, web siteniz için SSL ve HTTPS'yi etkinleştirmeniz gerekir. Bu, bir SSL sertifikası aracılığıyla web sitenizin güvenliğini artırır.
Şimdi DevKinsta uygulamasına gidin ve Siteyi aç düğmesini tıklayın. Yeni bir tarayıcı sekmesi, WordPress sitenizin ana sayfasını gösterecektir:
Bu, yazmaya başlayabileceğiniz WordPress blogunuz. Ancak Python'un WordPress REST API'sine erişmesini ve kullanmasını sağlamak için önce WordPress Admin'i yapılandırmamız gerekir.
Şimdi DevKinsta uygulamasındaki WP Yönetici düğmesini tıklayın, ardından WordPress Dashboard'a erişmek için kullanıcı ve şifrenizi girin:
Giriş yaptıktan sonra, WordPress Dashboard'u göreceksiniz:
WordPress, standart yöntemi olarak çerez kimlik doğrulamasını kullanır. Ancak bunu REST API kullanarak kontrol etmek istiyorsanız, WordPress REST API'sine erişim sağlayan bir teknikle kimlik doğrulaması yapmalısınız.
Bunun için Uygulama Şifrelerini kullanacaksınız. Bunlar, WordPress'in oluşturduğu ve web sitenizi yönetme iznine sahip bir kullanıcı profiliyle ilişkilendirdiği 24 karakter uzunluğundaki dizelerdir.
Uygulama Parolalarını kullanmak için Gösterge Tablosunda Eklenti menüsünü tıklayın, ardından aynı ada sahip eklentiyi arayın. Ardından Uygulama Parolaları Eklentisini kurun ve etkinleştirin:
Uygulama şifrenizi oluşturmaya başlamak için Kullanıcılar menüsünü genişleterek ve Tüm Kullanıcılar 'ı tıklayarak başlayın:
Şimdi, yönetici kullanıcı adınızın altındaki Düzenle'yi tıklayın:
Kullanıcı Düzenle sayfasını aşağı kaydırın ve Uygulama Şifreleri bölümünü bulun. Burada, daha sonra Python uygulama isteklerinizin kimliğini doğrulamak ve REST API'sini kullanmak için kullanacağınız Uygulama Parolası için bir ad girin:
WordPress'in sizin için rastgele 24 karakterli bir şifre oluşturabilmesi için Yeni Uygulama Şifresi Ekle'yi tıklayın:
Ardından, bu şifreyi kopyalayın ve daha sonra kullanmak üzere güvenli bir yere kaydedin. Unutmayın, bu sayfayı kapattığınızda bu şifreyi geri alamayacaksınız.
Son olarak, kalıcı bağlantıları yapılandırmanız gerekir. WordPress, kalıcı bağlantılarınız ve arşivleriniz için özel bir URL yapısı oluşturmanıza olanak tanır. Bunu, örneğin “İlk WordPress Web Siteniz” başlıklı bir WordPress gönderisine https://web siteniz.local:port/ilk-wordpress-website/ sezgisel URL'sinden erişilebilecek şekilde değiştirelim. Bu yaklaşım, gelişmiş kullanılabilirlik ve estetik dahil olmak üzere çeşitli faydalar sağlar.
Kalıcı bağlantıları yapılandırmak için Ayarlar bölümünü genişletin ve Kalıcı Bağlantılar menüsünü tıklayın. Burada, Ortak Ayarları Gönderi adı olarak değiştirin:

Kalıcı bağlantı yapısını Post name yapısını kullanarak ayarlamak da gereklidir çünkü bu, daha sonra Python kodumuzda JSON formatını kullanarak gönderileri almamıza izin verecektir. Aksi takdirde, bir JSON kod çözme hatası atılacaktır.
Python'dan WordPress Nasıl Kontrol Edilir
WordPress PHP ile yazılmıştır, ancak diğer programlama dillerinin, sitelerin ve uygulamaların içeriğini tüketmesini sağlayan bir REST API'sine sahiptir. WordPress içeriğinin REST mimarisinde gösterilmesi, onu JSON biçiminde kullanılabilir hale getirir. Bu nedenle, diğer hizmetler WordPress ile entegre olabilir ve yerel bir WordPress kurulumu gerektirmeden oluşturma, okuma, güncelleme ve silme (CRUD) işlemlerini gerçekleştirebilir.
Ardından, gönderi oluşturmak, almak, güncellemek ve silmek için WordPress REST API'sini nasıl kullanabileceğinizi görmek için basit bir Python uygulaması oluşturacaksınız.
Yeni basit Python projeniz için yeni bir dizin oluşturun ve buna PythonWordPress
gibi bir ad verin:
../PythonWordPress
Şimdi, projeniz için bağımsız bir dizi Python paketini sürdürmesine, bunları sistem dizinlerinizden ayırmasına ve sürüm çakışmalarından kaçınmasına olanak tanıyan bir sanal ortam oluşturacaksınız. venv
komutunu yürüterek sanal bir ortam oluşturun:
python3 -m venv .venv
Şimdi, .venv sanal ortamını etkinleştirmek için bir komut çalıştırın. Bu komut işletim sistemine göre değişir:
- Windows:
.venvScriptsactivate
- Mac/Linux:
.venv/bin/activate
Ardından, WordPress hesabınızla ilgili yapılandırmayı kaydedin. Uygulama yapılandırmasını Python kodunuzdan ayırmak için proje dizininizde bir .env dosyası oluşturun ve bu ortam değişkenlerini dosyaya ekleyin:
WEBSITE_URL="<>" API_USERNAME="<>" API_PASSWORD="<>"
Neyse ki, yukarıdaki verileri bir Python uygulamasından okumak kolaydır. Uygulamanızın yapılandırmayı .env dosyasından okuyabilmesi için Python-dotenv paketini yükleyebilirsiniz:
pip install python-dotenv
Ardından, Python için eşzamansız bir HTTP istemcisi/sunucusu olan aiohttp yükleyin:
pip install aiohttp
Şimdi aşağıdaki kodla app.py adlı bir dosya ekleyin:
import asyncio menu_options = { 1: 'List Posts', 2: 'Retrieve a Post' } def print_menu(): for key in menu_options.keys(): print (key, '--', menu_options[key] ) async def main(): while(True): print_menu() option = input_number('Enter your choice: ') #Check what choice was entered and act accordingly if option == 1: print('Listing posts...') elif option == 2: print('Retrieving a post...') else: print('Invalid option. Please enter a number between 1 and 5.') def input_number(prompt): while True: try: value = int(input(prompt)) except ValueError: print('Wrong input. Please enter a number ...') continue if value < 0: print("Sorry, your response must not be negative.") else: break return value def input_text(prompt): while True: text = input(prompt) if len(text) == 0: print("Text is required.") continue else: break return text if __name__=='__main__': asyncio.run(main())
Yukarıdaki kod bir konsol menüsü görüntüler ve bir seçenek belirlemek için bir sayı girmenizi ister. Ardından, bu projeyi genişletecek ve tüm gönderileri listelemenizi ve gönderi kimliğini kullanarak belirli bir gönderiyi almanızı sağlayan kodu uygulayacaksınız.

Koddaki Gönderileri Alma
WordPress REST API ile etkileşim kurmak için yeni bir Python dosyası oluşturmalısınız. Aşağıdaki içeriğe sahip wordpress_api_helper.py adlı bir dosya oluşturun:
import aiohttp import base64 import os import json from dotenv import load_dotenv load_dotenv() user=os.getenv("API_USERNAME") password=os.getenv("API_PASSWORD") async def get_all_posts(): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.get("/wp-json/wp/v2/posts") as response: print("Status:", response.status) text = await response.text() wp_posts = json.loads(text) sorted_wp_posts = sorted(wp_posts, key=lambda p: p['id']) print("=====================================") for wp_post in sorted_wp_posts: print("id:", wp_post['id']) print("title:", wp_post['title']['rendered']) print("=====================================") async def get_post(id): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.get(f"/wp-json/wp/v2/posts/{id}") as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) print("=====================================") print("Post") print(" id:", wp_post['id']) print(" title:", wp_post['title']['rendered']) print(" content:", wp_post['content']['rendered']) print("=====================================")
Yukarıdaki aiohttp kitaplığının kullanımına dikkat edin. Modern diller, eşzamansız programlamayı mümkün kılan sözdizimi ve araçlar sağlar. Bu, programın web istekleri, veritabanı işlemleri ve disk G/Ç gibi işlemlerin yanı sıra görevleri gerçekleştirmesine izin vererek uygulama yanıt hızını artırır. Python, asenkron programlama çerçevesi için bir temel olarak asyncio'yu sunar ve aiohttp kitaplığı, Python'da yapılan HTTP İstemci/Sunucu işlemlerine eşzamansız erişim sağlamak için asyncio'nun üzerine inşa edilmiştir.
Yukarıdaki ClientSession
işlevi eşzamansız olarak çalışır ve programımızın /wp-json/wp/v2/posts
uç noktasına karşı bir HTTP GET işlemi gerçekleştirmek için kullandığı bir session
nesnesi döndürür. Tüm gönderileri alma isteği ile belirli bir istek arasındaki tek fark, bu son isteğin URL yolunda bir post id
parametresi geçirmesidir: /wp-json/wp/v2/posts/{id}
.
Şimdi app.py dosyasını açın ve import
ifadesini ekleyin:
from wordpress_api_helper import get_all_posts, get_post
Ardından, get_all_posts
ve get_post
işlevlerini çağırmak için main
işlevi değiştirin:
if option == 1: print('Listing posts...') await get_all_posts() elif option == 2: print('Retrieving a post...') id = input_number('Enter the post id: ') await get_post(id)
Ardından uygulamayı çalıştırın:
python app.py
Ardından uygulama menüsünü göreceksiniz:
Şimdi Python uygulamanızın aldığı gönderilerin listesini görüntülemek için 1. seçeneği ve bir gönderi seçmek için 2. seçeneği deneyin:
Kodda Gönderiler Oluşturma
Python'da bir WordPress gönderisi oluşturmak için wordpress_api_helper.py dosyasını açarak başlayın ve create_post
işlevini ekleyin:
async def create_post(title, content): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.post( f"/wp-json/wp/v2/posts?content={content}&title={title}&status=publish" , auth=aiohttp.BasicAuth(user, password)) as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) post_id = wp_post['id'] print(f'New post created with id: {post_id}')
Bu kod, session
nesnesindeki post
işlevini çağırır ve auth
parametresini REST API bitiş noktası URL'sinin yanına iletir. auth
nesnesi artık WordPress kullanıcısını ve Uygulama Parolalarını kullanarak oluşturduğunuz parolayı içerir. Şimdi app.py dosyasını açın ve create_post
ve menüyü içe aktarmak için kod ekleyin:
from wordpress_api_helper import get_all_posts, get_post, create_post menu_options = { 1: 'List Posts', 2: 'Retrieve a Post', 3: 'Create a Post' }
Ardından üçüncü bir menü seçeneği ekleyin:
elif option == 3: print('Creating a post...') title = input_text('Enter the post title: ') content = input_text('Enter the post content: ') await create_post(title, f"{content}")
Ardından, uygulamayı çalıştırın ve WordPress'te yeni bir gönderi oluşturmak için bir başlık ve içerik ileterek 3. seçeneği deneyin:
Seçenek 1'in tekrar seçilmesi, yeni eklenen gönderinin kimliğini ve başlığını döndürür:
Yeni gönderiyi görüntülemek için WordPress web sitenizi de açabilirsiniz:
Koddaki Gönderileri Güncelleme
wordpress_api_helper.py dosyasını açın ve update_post
işlevini ekleyin:
async def update_post(id, title, content): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.post( f"/wp-json/wp/v2/posts/{id}?content={content}&title={title}&status=publish" , auth=aiohttp.BasicAuth(user, password)) as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) post_id = wp_post['id'] print(f'New post created with id: {post_id}')
Ardından app.py dosyasını açın ve update_post
ve menüyü içe aktarmak için kod ekleyin:
from wordpress_api_helper import get_all_posts, get_post, create_post, update_post menu_options = { 1: 'List Posts', 2: 'Retrieve a Post', 3: 'Create a Post', 4: 'Update a Post' }
Ardından dördüncü bir menü seçeneği ekleyin:
elif option == 4: print('Updating a post...') id = input_number('Enter the post id: ') title = input_text('Enter the post title: ') content = input_text('Enter the post content: ') await update_post(id, title, f"{content}")
Ardından uygulamayı çalıştırın ve mevcut bir gönderiyi güncellemek için bir gönderi kimliği, başlık ve içerik ileterek 4. seçeneği deneyin.
2. seçeneği seçmek ve güncellenmiş gönderi kimliğini geçmek, yeni eklenen gönderinin ayrıntılarını döndürür:
Koddaki Mesajları Silme
Bir gönderiyi silmek için gönderi kimliğini REST API'sine iletebilirsiniz.
wordpress_api_helper.py dosyasını açın ve delete_post
işlevini ekleyin:
async def delete_post(id): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.delete( f"/wp-json/wp/v2/posts/{id}" , auth=aiohttp.BasicAuth(user, password)) as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) post_id = wp_post['id'] print(f'Post with id {post_id} deleted successfully.')
Şimdi app.py dosyasını açın ve delete_post
ve menüyü içe aktarmak için kod ekleyin:
from wordpress_api_helper import get_all_posts, get_post, create_post, update_post, delete_post menu_options = { 1: 'List Posts', 2: 'Retrieve a Post', 3: 'Create a Post', 4: 'Update a Post', 5: 'Delete a Post', }
Ardından beşinci bir menü seçeneği ekleyin:
elif option == 5: print('Deleting a post...') id = input_number('Enter the post id: ') await delete_post(id)
Şimdi uygulamayı çalıştırın ve WordPress'teki mevcut gönderiyi silmek için bir kimlik ileterek 5. seçeneği deneyin:
Not: Gönderileri Listele seçeneğini çalıştırırsanız, silinen gönderi yine de görünebilir:
Gönderiyi sildiğinizi onaylamak için birkaç saniye bekleyin ve Gönderileri Listele seçeneğini tekrar deneyin. Ve bu kadar!
Özet
WordPress REST API ve Python'un HTTP istemci kitaplıkları sayesinde Python uygulamaları ve WordPress ekip oluşturup birbirleriyle konuşabilir. REST API'nin avantajı, WordPress'i bir Python uygulamasından uzaktan çalıştırmanıza izin vermesidir; burada Python'un güçlü dili, istediğiniz yapıyı ve sıklığı takip eden otomatik içerik oluşturmaya olanak tanır.
DevKinsta, yerel bir WordPress sitesi oluşturmayı ve geliştirmeyi hızlı ve kolay hale getirir. WordPress temaları ve eklentileri geliştirmek için yerel bir ortam sağlar ve Docker tabanlı, bağımsız kurulum modeli sayesinde basitleştirilmiş bir dağıtım modeli sunar.
Python ve WordPress ile çalışma deneyiminiz nedir?
Bu deneyimi genişletmeye hazır olduğunuzda, diğer olasılıkları keşfetmek için The Complete Guide to WordPress REST API Basics'i okuyabilirsiniz.