Get_template_part () sonucunu geçersiz kılmak mümkün mü?


11

Çocuk teması üzerinde çalışıyorum, çocuk temasının sadeliğini korumak ve zaman içinde kod ve bakım miktarını en aza indirmek için ana şablon dosyalarını geçersiz kılmamayı tercih ederim.

Döngüde, ana temanın index.php şablonu şunları kullanır: get_template_part( 'content' );

hangi content.php getirecektir , ben alt tema üzerine index.php oluşturmadan, content-aside.php , vb get_template_part( 'content', get_post_format() );gibi farklı şablonlar getirmek için daha benzer veya benzer davranmasını istiyorum tek satırlık bir değişiklik için üst.

get_template_part() içerir:

function get_template_part( $slug, $name = null ) {

    do_action( "get_template_part_{$slug}", $slug, $name );
    $templates = array();
    $name = (string) $name;
    if ( '' !== $name )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";
    locate_template($templates, true, false);
}

Yani bir dava var, benim durumumda get_template_part_content

Ben eylem gibi bir şey ile kanca olabilir:

add_action( 'get_template_part_content', 'child_post_styles', 10, 2 );

function child_post_styles ( $slug, $name ) {
    if( false == $name ){
        $name = get_post_format();
        $templates = array();
        if ( '' !== $name )
            $templates[] = "{$slug}-{$name}.php";

        $templates[] = "{$slug}.php";
        locate_template($templates, true, false);
    }
}

Bu açıkça bir kez kanca, benim istenen işlevi görüntüleyebilir ve diğer normal locate_templateçağrıget_template_part()

Birazdan bir gibi aptalca bir şey yaparak benim şablon kısmını çektikten sonra işlemek veya sayfayı bitirmeden çoğaltılması olmadan bunu yapmanın bir yolunu bulmak konusunda sorun yaşıyorum breakyaexit



3
Şablon kalıtımı olmadan sefil hayata hoş geldiniz. :)
Rarst

Yanıtlar:


3

Bunu yapmak için kanca yok. İndex.php dosyasını alt temaya kopyalayın ve tek satırda değişiklik yapın. Ayrıca, ana temanın yazarına esneklik için temalarında aynı değişikliği yapmaları gerektiğini söyleyin.


Bu şimdi yanlış, bkz. @ T-toudua burada cevap
Ivan Castellanos

Cevabı bir çözüm değil, çünkü şablon kısmı hala yükleniyor ve içeriyor. Eylem kancası bunu geçersiz kılamaz.
Otto

Doğru, ama ob_startiçinde kullanabilirsiniz ve ob_endbazı daha sonra kanca böylece idam ama asla yankı, hangi genellikle yeterince iyi. Veya PHP'yi sonlandırmaya zorlamak için exit () öğesini kullanabilirsiniz (hala eksik olan her şeyi el ile ekledikten sonra: altbilgi, vb.)
Ivan Castellanos

Ve bu hala bir çözüm değil. Çıktıyı bastırmak, işleri geçersiz kılmakla aynı şey değildir.
Otto

Çıkmak çıkışı bastırmaz; o noktada yürütmeyi etkili bir şekilde durdurur.
Ivan Castellanos

6

Bence elde etmek istediğiniz yol tam olarak mümkün değil. Şablon dosya adlarını değiştirmek için bir filtre almamak gerçekten can sıkıcı bir durum :(

Gerçi üzerinde bir geçici çözüm var. content.phpKarşılaştırma için kullanalım .

// content.php file 
$format = get_post_format();
if( '' != $format ){
    get_template_part( 'content-'. $format );
}
else{
    get_template_part( 'content-default' );
}

get_template_partFonksiyonun ikinci argümanını kullanmadım , daha çok content.phpdosya yoksa sonsuz çağrıları önlemek için ilk argümanda sonek geçtim 'content-'. $format.


Bunu yapmak için iyi bir yol olduğunu düşünüyorum. Neden kabul edilmediğinden emin değilim :)
Anh Tran

İtibar önemli, belki :)
Shazzad

Üzgünüm @Shazzad, cevabınızı çok zeki olduğu için bir oylama verdim.
TomHarrigan

3

Eh, orada ÇÖZÜM :

add_action('init', function(){ remove_all_actions('get_template_part_content'); });
add_action('get_template_part_content', 'yourFunc', 99, 2 );
function yourFunc ( $slug, $name ) {

    .........any codes here.............
    if ($name == 'header'){
       //but this will be executed before loading template... At this moment, Wordpress doesnt support any hooks for before/after LOAD_TEMPLATE...
    }
}

ancak dikkatlice düşünün, hangi kancaya bu eylemi eklemelisiniz ... manuel olarak konum almak, kullanmak, yani locate_template('content-header.php', false);


0

Content-aside.php adlı bir dosyayı çekmek istiyorsanız, işlevi şöyle çağırırsınız:

get_template_part( 'content', 'aside' );

İkinci parametre, kısa çizgiden sonraki disk denetleyicisinin adıdır. Dosyanız bir alt dizinde bulunuyorsa (templates / content-aside.php):

get_template_part( 'templates/content', 'aside' );

Yapmak istediğin bu mu?


Teşekkürler, anlıyorum. Tek bir satır değişikliği için üst temalar index.php üzerine yazmak için child temasında bir index.php oluşturmak zorunda değilsiniz. Alt temaya daha fazla bakım ekler. Mümkünse bir kanca ile başarmayı umuyorum.
TomHarrigan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.