Blog

WordPress Dinamik Bloklarında Ustalaşmak: Etkileşimli İçerik İçin PHP ve JavaScript'i Birleştirmek

Kullanıcılarınız için etkileşimli ve veri odaklı içerik deneyimleri sunmak üzere hem PHP hem de JavaScript'ten yararlanan dinamik WordPress blokları oluşturmayı öğrenin.

Özet

WordPress dinamik blokları, statik HTML'nin ötesine geçen, gerçek zamanlı veri entegrasyonu ve etkileşimli öğelere izin veren içerikler oluşturmak için güçlü bir yol sunar. Statik blokların aksine, dinamik bloklar çıktılarını PHP kullanarak sunucu tarafında oluşturur, bu da güncel bilgileri çekmelerini ve görüntülemelerini sağlar. Bu makale, blok kaydı, sunucu tarafı oluşturma geri çağırmaları ve istemci tarafı öznitelik işleme gibi temel kavramları kapsayarak kendi dinamik bloklarınızı geliştirmeniz için pratik bir rehber sunmaktadır. En son gönderileri görüntüleyen dinamik bir blok oluşturmayı adım adım gösteren bir örnekle ilerleyeceğiz ve daha karmaşık etkileşimli bileşenler için bir temel oluşturacağız.

WordPress Dinamik Bloklarında Ustalaşmak: Etkileşimli İçerik İçin PHP ve JavaScript'i Birleştirmek

WordPress, temelinde sağlam bir PHP mimarisi ve MySQL veritabanı üzerine kurulu güçlü bir İçerik Yönetim Sistemi'dir (CMS). Genişletilebilirliği, öncelikle temalar ve eklentiler aracılığıyla elde edilen temel bir gücüdür. Blok düzenleyicisi Gutenberg'in ortaya çıkışı, modüler, JavaScript odaklı bir arayüz tanıtarak içerik oluşturma biçimini değiştirdi. Statik Gutenberg blokları yapılandırılmış, değişmeyen içerikler için harika olsa da, birçok gerçek dünya senaryosu dinamik, etkileşimli ve veri odaklı içerikler gerektirir. İşte dinamik blokların devreye girdiği yer burasıdır ve sunucu tarafı PHP mantığı ile istemci tarafı JavaScript etkileşimliliği arasında güçlü bir köprü sunar.

Dinamik Blokların Gücünü Anlamak

Gutenberg'deki varsayılan statik bloklar, kaydedildiğinde HTML'yi istemci tarafında oluşturur. Bu HTML daha sonra doğrudan gönderi içeriğine kaydedilir. Statik içerikler için verimli olsa da, bu yaklaşımın sık sık değişen veya sunucu tarafı işlem gerektiren verilerle uğraşırken sınırlamaları vardır. Dinamik bloklar ise, çıktılarını PHP kullanarak sunucu tarafında oluşturarak bu sorunu çözer. Bir kullanıcı dinamik bir blok içeren bir sayfayı görüntülediğinde, WordPress, bloğun HTML'sini anında oluşturmak için bir PHP fonksiyonunu ( render_callback ) yürütür. Bu, bloğun gerçek zamanlı verileri veritabanından çekmesine, diğer WordPress işlevleriyle etkileşim kurmasına ve her zaman güncel bilgileri sunmasına olanak tanır.

Bu sunucu tarafı oluşturma birkaç nedenden dolayı önemlidir:

  • Gerçek Zamanlı Veri: En son gönderileri, yaklaşan etkinlikleri, borsa fiyatlarını veya sık sık değişen diğer verileri görüntüleme.
  • Karmaşık Mantık: Çıktıyı oluşturmadan önce hesaplamalar yapma, özel gönderi türlerini sorgulama veya harici API'lerle entegre olma.
  • Güvenlik: Özellikle kullanıcı tarafından oluşturulan içerik veya harici kaynaklarla uğraşırken, verileri görüntülemeden önce temizleme ve doğrulama.
  • Performans: Karmaşık oluşturma görevlerini sunucuya yüklemek bazen istemci tarafı performansı artırabilir.

Dinamik Bir Bloğun Anatomisi

Herhangi bir Gutenberg bloğu gibi dinamik bir blok da meta verileri ve JavaScript kaydı ile tanımlanır. Ancak, benzersiz özelliği, kayıt sırasında belirtilen render_callback özniteliğinde yatar. Bu geri çağırma fonksiyonu, sunucuda bloğun HTML çıktısını oluşturmaktan sorumludur.

İşte temel bileşenlerin bir dökümü:

  1. Blok Kaydı (JavaScript): Bloğunuzun var olduğunu ve özniteliklerini ve düzenleyici arayüzünü nasıl işleyeceğini Gutenberg'e bildirmek için JavaScript dosyanızda registerBlockType() kullanarak bloğunuzu kaydetmeniz gerekir.
  2. Öznitelikler: Bunlar, gönderi içeriğinde saklanan bloğunuzla ilişkili veri alanlarıdır. Dinamik bloklar için öznitelikler öncelikle düzenleyicide bloğun davranışını ve ayarlarını yapılandırmak için kullanılır. Görüntülenen gerçek içerik render_callback tarafından oluşturulur.
  3. render_callback (PHP): Bu, dinamik bloğun kalbidir. Bloğun özniteliklerini bir argüman olarak alan ve ön uçta oluşturulacak HTML dizesini döndüren bir PHP fonksiyonudur.
  4. Düzenleyici Arayüzü (JavaScript): Bloğun arayüzünü React bileşenlerini kullanarak Gutenberg düzenleyicisinde oluşturmaya devam edeceksiniz. Bu arayüz, kullanıcıların bloğun özniteliklerini yapılandırmasına ve dinamik içeriğin nasıl görüneceğine dair bir önizleme (genellikle basitleştirilmiş bir temsil) görmesine olanak tanır.

Adım Adım: Dinamik "Son Gönderiler" Bloğu Oluşturma

Pratik bir örnek oluşturalım: WordPress sitenizden en son gönderilerin bir listesini görüntüleyen dinamik bir blok.

Ön Koşullar:

  • Yerel bir WordPress geliştirme ortamı.
  • PHP ve JavaScript hakkında temel bilgi.
  • Blok kodunuzu ekleyeceğiniz bir eklenti veya tema.

Adım 1: Blok Eklentisi/Teması Kurulumu

Özel bir eklentiniz veya temanız yoksa, basit bir tane oluşturun. Bu örnek için, bunu bir eklentiye eklediğinizi varsayacağız.

Adım 2: Bloğu Kaydetme (JavaScript)

Eklentinizin JavaScript dosyasında (örneğin, src/index.js), bloğu kaydedeceksiniz. Uluslararasılaştırma için @wordpress/blocks ve @wordpress/i18n kullanacağız.

// src/index.js

import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';

// Bloğunuzun düzenleme bileşenini içe aktarın
import Edit from './edit';

registerBlockType( 'my-dynamic-blocks/recent-posts', {
    title: __( 'Recent Posts', 'my-dynamic-blocks' ),
    icon: 'list-view',
    category: 'widgets',
    attributes: {
        numberOfPosts: {
            type: 'number',
            default: 5,
        },
        showExcerpt: {
            type: 'boolean',
            default: true,
        },
    },
    edit: Edit,
    // save() fonksiyonu dinamik bloklar için GEREKLİ DEĞİLDİR
    // Sunucu tarafı render_callback çıktıdan sorumlu olacaktır
} );

Adım 3: Düzenleyici Bileşenini Oluşturma (JavaScript)

Şimdi src/edit.js dosyasını oluşturun. Bu bileşen, bloğun Gutenberg düzenleyicisinde nasıl görüneceğini ve davranacağını tanımlayacaktır.

// src/edit.js

import { useBlockProps, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, RangeControl, ToggleControl } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import ServerSideRender from '@wordpress/server-side-render';

export default function Edit( { attributes, setAttributes } ) {
    const blockProps = useBlockProps();
    const { numberOfPosts, showExcerpt } = attributes;

    return (
        <div { ...blockProps }>
            <InspectorControls>
                <PanelBody title={ __( 'Post Settings', 'my-dynamic-blocks' ) }>
                    <RangeControl
                        label={ __( 'Number of Posts', 'my-dynamic-blocks' ) }
                        value={ numberOfPosts }
                        onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
                        min={ 1 }
                        max={ 10 }
                    />
                    <ToggleControl
                        label={ __( 'Show Excerpt', 'my-dynamic-blocks' ) }
                        checked={ showExcerpt }
                        onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
                    />
                </PanelBody>
            </InspectorControls>
            {
                // Dinamik bloğun çıktısının bir önizlemesini görüntülemek için ServerSideRender'ı kullanın
                <ServerSideRender
                    block="my-dynamic-blocks/recent-posts"
                    attributes={ attributes }
                />
            }
        </div>
    );
}

Bir save() fonksiyonu tanımlamadığımızı fark edin. Bu, dinamik bloklar için temel farktır. ServerSideRender bileşeni, sunucuya bir istek yaparak bloğun çıktısının bir önizlemesini doğrudan düzenleyicide görüntülemek için kullanılır.

Adım 4: Betikleri Yükleme ve Sunucu Tarafı Oluşturmayı Kaydetme (PHP)

Eklentinizin ana PHP dosyasında (örneğin, my-dynamic-blocks.php), JavaScript dosyanızı yüklemeniz ve render_callback dahil olmak üzere blok türünü kaydetmeniz gerekir.

<?php
/**
 * Plugin Name: My Dynamic Blocks
 * Description: A simple plugin for dynamic Gutenberg blocks.
 * Version: 1.0
 * Author: Your Name
 */

function my_dynamic_blocks_register_block() {
    // Blok türünü kaydet
    register_block_type( 'my-dynamic-blocks/recent-posts', array(
        'editor_script' => 'my-dynamic-blocks-editor-script',
        'render_callback' => 'my_dynamic_blocks_render_recent_posts',
        'attributes' => array(
            'numberOfPosts' => array(
                'type' => 'number',
                'default' => 5,
            ),
            'showExcerpt' => array(
                'type' => 'boolean',
                'default' => true,
            ),
        ),
    ) );
}
add_action( 'init', 'my_dynamic_blocks_register_block' );

function my_dynamic_blocks_enqueue_editor_scripts() {
    wp_enqueue_script(
        'my-dynamic-blocks-editor-script',
        plugins_url( 'build/index.js', __FILE__ ), // Bir derleme süreciniz olduğunu varsayarak
        array( 'wp-blocks', 'wp-element', 'wp-editor', 'wp-components', 'wp-i18n', 'wp-server-side-render' ),
        filemtime( plugin_dir_path( __FILE__ ) . 'build/index.js' )
    );
}
add_action( 'enqueue_block_editor_assets', 'my_dynamic_blocks_enqueue_editor_scripts' );

/**
 * Recent Posts dinamik bloğu için oluşturma geri çağırma fonksiyonu.
 *
 * @param array $attributes Blok öznitelikleri.
 * @return string HTML çıktısı.
 */
function my_dynamic_blocks_render_recent_posts( $attributes ) {
    $number_of_posts = isset( $attributes['numberOfPosts'] ) ? (int) $attributes['numberOfPosts'] : 5;
    $show_excerpt    = isset( $attributes['showExcerpt'] ) ? (bool) $attributes['showExcerpt'] : true;

    $args = array(
        'posts_per_page' => $number_of_posts,
        'post_status'    => 'publish',
        'orderby'        => 'date',
        'order'          => 'DESC',
        'ignore_sticky_posts' => true,
    );

    $recent_posts_query = new WP_Query( $args );

    $output = '';

    if ( $recent_posts_query->have_posts() ) {
        $output .= '<ul class="wp-block-my-dynamic-blocks-recent-posts">'; // Stil için bir sınıf kullanın
        while ( $recent_posts_query->have_posts() ) {
            $recent_posts_query->the_post();
            $output .= '<li>';
            $output .= '<a href="' . esc_url( get_permalink() ) . '">' . esc_html( get_the_title() ) . '</a>';
            if ( $show_excerpt ) {
                $output .= '<p>' . get_the_excerpt() . '</p>';
            }
            $output .= '</li>';
        }
        $output .= '</ul>';
        wp_reset_postdata(); // Özel döngüden sonra gönderi verilerini sıfırlamak önemlidir
    } else {
        $output = '<p>' . __( 'No posts found.', 'my-dynamic-blocks' ) . '</p>';
    }

    return $output;
}

PHP kodunun açıklaması:

  • my_dynamic_blocks_register_block(): Bu fonksiyon, blok türümüzü kaydetmek için init eylemine bağlanır. Kritik olarak, render_callback'i my_dynamic_blocks_render_recent_posts olarak tanımlar ve ayrıca JavaScript'te tanımlanana benzeyen bloğun özniteliklerini de iletir.
  • my_dynamic_blocks_enqueue_editor_scripts(): Bu fonksiyon, JavaScript dosyamızı yalnızca düzenleyici için yüklemek üzere enqueue_block_editor_assets eylemine bağlanır. Bağımlılık olarak wp-server-side-render'ı içerir.
  • my_dynamic_blocks_render_recent_posts(): Bu bizim render_callback'imizdir. $attributes dizisini alır, bunları temizler ve doğru türlere dönüştürür, ardından en son gönderileri almak için WP_Query'yi kullanır. Bir HTML <ul> listesi oluşturur ve döndürür. wp_reset_postdata(), orijinal WordPress sorgusuyla çakışmaları önlemek için özel bir WP_Query döngüsünden sonra hayati önem taşır.

Adım 5: JavaScript'inizi Derleyin

Modern bir JavaScript derleme süreci ( @wordpress/scripts gibi) kullanıyorsanız, varlıklarınızı derlemeniz gerekecektir. Eklentinizin dizininde npm run build (veya yarn build) komutunu çalıştırın.

Adım 6: Etkinleştirin ve Test Edin

Eklentinizi etkinleştirin. Şimdi 'Son Gönderiler' bloğunu bir gönderiye veya sayfaya eklediğinizde, düzenleyici arayüzünü göreceksiniz. Önizleme alanı, PHP geri çağırma fonksiyonunuz tarafından oluşturulan çıktıyı gösterecektir. Gönderiyi yayınladığınızda veya güncellediğinizde, dinamik içeriği görüntülemek için aynı PHP geri çağırma fonksiyonu ön uçta çalışacaktır.

En İyi Uygulamalar ve Uyarılar

  • Önce Güvenlik: render_callback'inizde kullanmadan önce özniteliklerden veya harici kaynaklardan gelen tüm verileri daima temizleyin ve doğrulayın. esc_html(), esc_url(), sanitize_text_field() gibi WordPress fonksiyonlarını kullanın.
  • wp_reset_postdata(): render_callback'iniz WP_Query kullanıyorsa veya global $post nesnesini değiştiriyorsa, orijinal sorguyu ve gönderi verilerini geri yüklemek için her zaman sonrasında wp_reset_postdata()'yı çağırın.
  • Performans Hususları: Dinamik bloklar güçlü olsa da, aşırı veya karmaşık sunucu tarafı oluşturma sayfa yükleme sürelerini etkileyebilir. Sorgularınızı ve oluşturma mantığınızı optimize edin. Performans bir sorun haline gelirse önbelleğe alma mekanizmalarını düşünün.
  • Düzenleyici Önizlemesi: ServerSideRender bileşeni iyi bir önizleme sağlar, ancak sunucu isteği yapmaya dayanır. Çok karmaşık bloklar için bu anlık olmayabilir. render_callback'inizin verimli olduğundan emin olun.
  • Öznitelik İşleme: Öznitelikler öncelikle düzenleyicide bloğu yapılandırmak için kullanılır. Gerçek dinamik içeriği almak ve görüntülemek render_callback'in sorumluluğundadır. Büyük miktarda dinamik veriyi doğrudan özniteliklerde saklamaktan kaçının.
  • Adlandırma Kuralları: Diğer eklentilerle veya temalarla çakışmaları önlemek için blok adlarınız (örneğin, my-plugin-slug/block-name) ve PHP fonksiyon adlarınız için benzersiz önekler kullanın.
  • Uluslararasılaştırma: Hem JavaScript hem de PHP kodunuzdaki çevrilebilir dizeler için __() ve _n() kullanın.

Son Gönderilerin Ötesinde: Dinamik Blok Yeteneklerini Genişletme

"Son Gönderiler" örneği buzdağının sadece görünen kısmıdır. Dinamik blokları şunlar için kullanabilirsiniz:

  • Özel gönderi türlerini görüntüleme: Ürünleri, portföy öğelerini veya etkinlikleri sergileme.

  • Kullanıcıya özel içerik: Oturum açmış kullanıcıyla ilgili içeriği görüntüleme.

  • Etkileşimli formlar: Karmaşık formlar hala özel eklentilerden faydalanabilse de, basit dinamik formlar oluşturulabilir.

  • Veri görselleştirme: Bir API'den veri çekme ve grafikler veya çizelgeler oluşturma (ancak bu genellikle daha gelişmiş JavaScript kütüphaneleri gerektirir).

  • Diğer eklentilerle entegrasyon: Diğer eklentiler tarafından yönetilen verileri dinamik olarak görüntüleme.

Sonuç

Dinamik WordPress blokları, Gutenberg düzenleyicisinde gerçekten etkileşimli ve veri odaklı deneyimler oluşturmak isteyen geliştiriciler için vazgeçilmez bir araçtır. render_callback fonksiyonlarıyla blokları kaydetmeyi ve öznitelikleri etkili bir şekilde yönetmeyi anlayarak, gerçek zamanlı bilgileri çeken ve görüntüleyen güçlü bileşenler oluşturabilirsiniz. Statik bloklar yapılandırılmış içerikler için amaçlarına hizmet ederken, dinamik bloklar sunucu tarafı mantığı ile ön uç sunumu arasındaki boşluğu doldurmanıza olanak tanıyarak yeni bir işlevsellik seviyesinin kilidini açar. Güvenlik, performans ve kod organizasyonu için en iyi uygulamaları izleyerek, WordPress web sitelerinizi geliştiren sağlam ve kullanışlı dinamik blokları güvenle geliştirebilirsiniz.

Sources (5)