WP-CLI Post ve Meta İle Tüm Postlara Aynı Görseli Atamak
Visual Composer Shortcode temizliği yazımda yeni tema ve bu süreçte karşılaştığım durumlarda dair sorunlar ve çözümlerine giriş yapmıştım.
Elbette, sürecin tamamı bu yazıdan ibaret değildi. Bir sonraki aşamada (gereksiz kodları temizledikten sonra) görseller üzerinde düzenlemeler yapmak istedim. Önceki temamda farklı boyutlarda konumlanan yazı görselleri (featured image, thumbnail, vb.) bu yeni temada belirli bir konumlandırmaya ve yükseklik/genişliğe sahip olmalıydı. Ek olarak, bazı yazılar görsellerinin de tanımladığım bir görselle değiştirilmesi gerekiyordu. Bu farklı durumlara istinaden ilerleyişe bir bakalım.
WP-CLI Post ve Görsel Atama İşlemleri
Bir süredir yazı içi görselleri WebP veya JPEG2000 olarak cloudinary.com üzerinden yazılara dahil etmekteydim. Benzer bir süreç için, ilgili servisin bu amaçla yayınladığı WordPress eklentisi1 dışında Auto Cloudinary eklentisi2 de tercih edilebilir. Yeni temamda toplamda 3 post_type
kullandım; post (standart), project ve course. Bu süreçte karşılaştığım ilk problem register_post_type()
ile oluşturduğum tipler 'capability_type' => 'post
olmalarına ve supports olarak thumnail
ilişkili olmalarına rağmen görsel alanını sunmamaktaydı. Sorunu kısa sürede çözümlemek mümkün olmayınca alternatif yöntemler üzerine kafa yormaya karar verdim. Bir yazıya (tabi bunun için öne çıkan görsel bağlantısının görünüyor olması lazım) görsel eklememizi sağlayan URL bağlantısı aslında şöyle; /wp-admin/media-upload.php?post_id=[post-id]
. iframe
olarak açılan bu URL’deki [post-id]
görsel alanı açılsın ya da açılmasın ayrı bir sekmede görüntülenip görsel tanımlanırsa ilgili yazı ile eşleştirilir. Bu mantık elbette wp-cli için de geçerli ve benim de ilerleme yöntemim bu şekilde oldu.
İlk çözümlemem gereken durum tüm görsellere aynı thumbnail’i iletmek olmalıydı ve bu amaçla wp media
ve wp post meta
komutunu kullanmaya karar verdim. wp media import
kullanımı özetle şöyle:
wp media import ~/[gorsel-yolu]/[gorsel-adi] --post_id=[post-id] \
--title="[gorsel-basligi]" --featured_image
Konuyla ilgili araştırmalar yaparken Dev Notes > Bulk Import Images Using WP-CLI3 yazısına denk geldim. Buradaki yönergeleri takip edebilirsiniz. Örnek komut satırı şöyleydi:
ATT_ID="$(wp media import ~/[gorsel-yolu]/[gorsel-adi] --porcelain)"
wp post list --post_type=post --format=ids | \
xargs -0 -d ' ' -I % wp post meta add % \_thumbnail_id $ATT_ID
Bu komut uygulandığında ATT_ID içeriğine wp media import ~/[gorsel-yolu]/[gorsel-adi] --porcelain
sonrasında dönen ID atanmakta wp post list --post_type=post --format=ids
ID’lere göre listelenen4 postlara xargs ile (pipe) _thumbnail_id
meta’sına ilgili ID (ATT_ID) atanmakta. ATT_ID="$(wp media import ~/[gorsel-yolu]/[gorsel-adi] --porcelain)"
satırını kullanmak yerine xargs
işlemindeki $ATT_ID
alanına kendiniz de media ID5 değeri verebilirsiniz6. Bunun için yapmanız gereken kullanmak istediğiniz görselin ID değerini Media (Ortam) bölümünden görüntüleyebilirsiniz5. Paylaşımlı hosting alanında xargs
kullanımında bazı sınırlandırmalar olabilmekte. Bu nedenle xargs
yerine farklı bir şekilde ilerlemek gerekebilir. Örneğin, aşağıdaki 2 farklı kod paylaşıyorum.
wp post meta update $(wp post list --post_type=post --format=ids) _thumbnail_id [id-degeri]
Yukarıdaki komut wp post list --post_type=post --format=ids
ile post’ların ID’lerini alacak ve wp post meta update
içeriğinde kullanacaktır6 7. Kodun sorunu ilgili ID’leri (--format=ids
) tek satırda çekiyor olması. Kodu uyguladığınızda Error: Too many positional arguments:...
şeklinde hata alacak olmanızın nedeni de değerlerin tek satırda dönüşü. Elbette ilgili işlem sonrasında değerleri ayrı satırlara dönüştürebilirsiniz, ancak neden ayrıca kendinize iş edinesiniz! xargs sorununu (bu konuya ayrıca değinmekte fayda var) da dahil ederek şöyle bir çözüm ürettim.
wp post list --post_type=post --field=ID --format=table >> id.txt
while read line; do
wp post meta update $line _thumbnail_id [media-id]
done < id.txt
Kodun ilk satırında wp post list
ile post tipindeki yazıların ID değerlerini table olarak (--format=table
) alıyor ve id.txt
dosyasına her ID ayrı satırda olacak şekilde atıyorum. Artık elimde takip edebileceğim bir ID akışı var. xargs ile tek satırda çözememiş olabilirim ancak while
ile loop oluşturarak da ID'lerimi kullanabiliyorum. while içerisindeki alanda da id.txt
içeriğindeki ID'ler satır satır $line
değişkenine atanmakta ve belirttiğim [media-id]
değeri ile ilişkilendirilmekte. Bu sayede ön tanımlı olarak seçtiğim medya tüm yazılarım için ayarlanmış olmakta. Komutun uygulanmasının ardından satır satır işlemlere dair dönüşler alacaksınız.
Success: Updated custom field '_thumbnail_id'.
Success: Value passed for custom field '_thumbnail_id' is unchanged.
while
döngüsü içerisindeki wp post meta update
satırını şöyle güncellersek ne olur?
wp post meta update $line _thumbnail_id $line --allow-root
Her post id değeri aynı zamanda medya id değeri olarak atanır. Ana problemimiz (aynı görseli tüm yazılara tanımlamak) genel hatlarıyla bu şekilde çözülmüş oldu. Ancak, örneği biraz daha çeşitlendirmek istiyorum. Aşağıdaki örnek satırın görevi id.txt
dosyasındaki post ID'leri kontrol etmek ve eğer _thumbnail_id
tanımlanmamış (örneğin bir medyayı sildiniz ve etkilenen postları belirlemek istiyorsunuz) postları listelemek. Eğer ilgili yazı _thumbnail_id
içermiyorsa da o yazı ID değerini new.txt
dosyasına yazmak.
Test etmek için yukarıdaki komutu uygulayıp tüm yazılara tek bir medya ID atayın ve ardından bu medyayı silin. Aşağıdaki komut sonrasında herhangi bir ID new.txt
içeriğine yazdırılmayacaktır. Bir sonraki döngüde new.txt içeriğini kullanarak sadece _thumbnail_id
içeriği olmayan postlara görsel atayabiliriz.
while read line; do
wp post meta list $line --allow-root --keys=_thumbnail_id --format=table --fields=id | grep '[0-9]' >> new.txt
done < id.txt
Yukarıdaki işlemler sonucunda belirlediğimiz tüm yazılara (tip, tarih, meta içeriği vb.) belirlediğimiz bir medyayı görsel olarak atadık ve/veya görsel atanmamış yazılarımızı belirledik ve görsel atama işlemini hızlı bir şekilde gerçekleştirdik.
- Cloudinary's WordPress Plugin. cloudinary/cloudinary_wordpress. GitHub ↩
- Junaid Bhura. Auto Cloudinary. WordPress Plugins ↩
- David Egan. (2016). Bulk Import Images Using WP-CLI ↩
- wp post list. WP-CLI Commands ↩
- wp-cli/media-command. GitHub ↩ ↩
- wp post meta \<command}>. WP-CLI Commands ↩ ↩
- wp post meta update. WP-CLI Commands ↩