Kategoriler
Blog

wp_postmeta duplicate olan kayıtları temizlemek

Blogger blogundan WordPress bloguna post aktarıldığında her post için *wp_postmeta tablosuna 3 adet meta(custom fields) ekler, bunlar; blogger_author, blogger_permalink, blogger_blog.

  • blogger_author = bloggerdaki postun yazar bilgisi
  • blogger_permalink = bog postunun url i
  • blogger_blog = bogun adresi.

wordpress database

Bazen, özellikle çok fazla post varsa postları içeri aktarırken sorunlar yaşanır, genelde memory yetmez ve benzeri, böyle olunca içeri aktarma işlemi yarıda kalır ve sonra yeniden aktarmaya devam etmek isteriz.

Yeniden devam ettiğimizde aynı post id için birden fazla, deneme sayısına göre wp_postmeta tablosunda 4-5 tane duplicate kayıt oluyor. wp_postmeta tablosundaki bu duplicate kayırlar görünürde sorun yaşatmıyor gibi görünsede performansı etkiliyor.

Sorunu çözmek için aşağıdaki sorguyu wp_postmeta tablosuna yapmak gerekir:

delete from wp_postmeta 
where meta_id in (
select *
from (
select meta_id
from wp_postmeta a
where a.meta_key = 'blogger_blog'
and meta_id not in (
select min(meta_id)
from wp_postmeta b
where b.post_id = a.post_id
and b.meta_key = 'blogger_blog'
)
) as x
);

Yada sizin için PhpMyadmin veya Mysql herhangi bir şekilde ulaşmak zor ise ftp den ana dizine aşağıdaki kodların bulunduğu bir *.php dosyasını atıp bir defa çalıştırın aynı işi yapar:

<?php 
define('WP_USE_THEMES', false);
require('wp-blog-header.php');
define( 'WP_DEBUG_DISPLAY', true );
ini_set( 'display_errors', true );
$allposts = get_posts(’numberposts=-1&post_type=post&post_status=any');
$keys = array('blogger_blog', 'blogger_author', 'blogger_permalink');
foreach ( $keys as $key ) {
foreach( $allposts as $postinfo) {
// Fetch array of custom field values
$postmeta = get_post_meta($postinfo->ID, $key);

if (!empty($postmeta) ) {
// Delete the custom field for this post (all occurrences)
delete_post_meta($postinfo->ID, $key);

// Insert one and only one custom field
update_post_meta($postinfo->ID, $key, $postmeta[0]);
}
}
}
?>
*wp_ varsayılan WordPress tablo ön ekidir.

WordPress admin panelinden PhpMyadmin kullanma deneyimi için Adminer isimli eklentiyi kullanabilirsiniz, eklenti standart PhpMyadmin e göre çok hafiftir.

Siteye yeni bir sayfa ekledim, sevilenler. Sayfada en çok ziyaret edilmiş yazılardan en fazla yıldız verilenden itibaren sonsuza kadar listeliyor.

Oyun, oyunlar, oyunları 🙂 Yıllardır boşa zaman harcamışız, bir oyun sitesi açıp hakkatten köşeyi çok rahat dönebilirdim panpa, nahnahnahnıonanısnaınsdasd.

merhaba wolkanca…
ikinci seçeneği uyguladım… daha sonra veri tabanını tekrar indirdim… boyutları aynı… bu işlemin başarıya ulaştığını kesin olarak nasıl anlayabilirim…
teşekkür ederim.

@ahmet

bu verilerin boyutu çok fazla değil, yani içerisinde çok az veri var ama tablo sayısı olarak fazlalar.

anlamak için sorguyu yaptıktan sonra verdiği sonuca bakabilirsin. sen ikinci seçeneği yaptığın için sanırım bir şey göstermemiştir. istersen yazı içerisinde bağlantısı olan adminer isimli eklentiyi kurup ilk seçenek olan mysql sorgusunu çalıştırabilirsin o sana sonucu gösterir. 0 tablo etkilendi derse ilk yaptığında zaten silmişindir fazlalıkları.

kolay gelsin.

merhaba… ikinci seçeneği uygulamadım. 1. olduğu konusunda tereddütüm kalmadı.

bu ve diğer faydalı paylaşımların için teşekkür ederim….