Kategoriler
WordPress

Farklı bir offset metodu (WordPress)

WP loopda spesifik seçili bir veya fazla kategoriden ilk birkaç yazıyı çıkarmak.

Normalde WP Query’de offset=3 tanımlayarak en baştaki istediğiniz adet girdiyi göz ardı edebiliyorsunuz ancak bunu spesifik kategorilere veya etiketlere göre yapabilmek de bazı durumlarda gerekli olabilir.

Bu blogun ana sayfasında öyle bir durum oluştu ve sadece Genel kategorisindeki ilk 3 girdiyi çıkarmam gerekiyordu ancak Query tüm yazıları aldığı için normal offset=3 vermem diğer kategorilerdeki yazıları da göz önünde bulundurduğu için son yazılardan biri veya birkaçı farklı kategoriden de olsa onu gizliyordu.

Dolayısıyla aşağıdaki basit kodu geliştirdim, aslında birçok yerde örnek kodlar verilmişti ama en basit ve performanslı çalışanı budur:

$exclude_cats = [1, 3]; //gizlenecek kategorilerin IDs
$exclude_post_ids = get_posts([
'fields' => 'ids',
'posts_per_page' => 3, //Gizlenecek adet
'category__in'   => $exclude_cats,
]); 

Fonksiyon haline getirilirse şu şekilde kullanılabilir:

add_action( 'pre_get_posts', function( $q )
{
    $exclude_cats = [ 12, 34 ]; // <-- Edit these category ids!

    if(    ! is_admin() 
        && $q->is_main_query()
        && ! is_singular()
        && ! is_category( $exclude_cats ) 
    )
   {
        $exclude_post_ids = get_posts( 
            [
                'fields'         => 'ids',
                'posts_per_page' => 5,
                'category__in'   => $exclude_cats,
            ]
        );
        $q->set( 'post__not_in', (array) $exclude_post_ids ); 
   }
});

Üsteki kodun kaynağı: https://wordpress.stackexchange.com/a/187479/172000

Örnek kullanım:

$exclude_cats = [1]; 
$exclude_post_ids = get_posts([
'fields' => 'ids',
'posts_per_page' => 3,
'category__in'   => $exclude_cats,
]); 

$args = array(
'posts_per_page'   => 10,
'post_status'      => 'publish',
/* WOLKANCA */
'post__not_in' => (array) $exclude_post_ids,
/* WOLKANCA */
);

Kodun yaptığı şeyi uzman arkadaşlarımız bilir ama ben diğer arkadaşlara da mantığı özetleyeyim; seçtiğimiz kategori/kategorilerden ilk 3 girdinin IDs alıp onları sonraki sorgu parametremizde post__not_in içerisine yazarak loop içerisinden çıkarılması.

Kolay gelsin, umarım benim gibi sizin de işinize yarar.