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.

AA

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.

WP-Cli Thumbnail

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