Apakah ada variabel untuk nama komponen templat?

8

Salah satu yang Anda sebut templat dengan get_template_part()(atau locate_template()) apakah ada cara untuk mengetahui templat apa yang Anda gunakan

Misalnya jika Anda menelepon get_template_part('loop','archive');dariarchive.php

dan kemudian bekerja di file loop-archive.php Anda. apakah ada cara untuk mendefinisikan variabel yang memiliki nama bagian templat saat ini .... so $template = 'loop-archive'. lebih baik lagi, mungkin di dua bagian jadi 'loop' dan 'arsip' tapi saya bisa melakukannya dengan beberapa string splitting.

Pertanyaan # 10537 sepertinya berhubungan tetapi sepertinya tidak mencakup bagian templat .

helgatheviking
sumber

Jawaban:

2

Tidak ada variabel global inti yang mengembalikan konteks saat ini. Namun, Anda dapat membuat sendiri, menggunakan tag kondisional templat kontekstual . Anda dapat menelusuri tag bersyarat dalam urutan yang sama dengan inti WordPress, dengan mengikuti wp-includes/template-loader.php.

Cukup bungkus keluaran Anda dalam fungsi Tema khusus. Inilah cara saya melakukannya (catatan: Saya rasa saya tidak mengikuti template-loader.php):

function oenology_get_context() {

    $context = 'index';

    if ( is_home() ) {
        // Blog Posts Index
        $context = 'home';
        if ( is_front_page() ) {
            // Front Page
            $context = 'front-page';
        } 
    }else if ( is_date() ) {
        // Date Archive Index
        $context = 'date';
    } else if ( is_author() ) {
        // Author Archive Index
        $context = 'author';
    } else if ( is_category() ) {
        // Category Archive Index
        $context = 'category';
    } else if ( is_tag() ) {
        // Tag Archive Index
        $context = 'tag';
    } else if ( is_tax() ) {
        // Taxonomy Archive Index
        $context = 'taxonomy';
    } else if ( is_archive() ) {
        // Archive Index
        $context = 'archive';
    } else if ( is_search() ) {
        // Search Results Page
        $context = 'search';
    } else if ( is_404() ) {
        // Error 404 Page
        $context = '404';
    } else if ( is_attachment() ) {
        // Attachment Page
        $context = 'attachment';
    } else if ( is_single() ) {
        // Single Blog Post
        $context = 'single';
    } else if ( is_page() ) {
        // Static Page
        $context = 'page';
    }

    return $context;
}

Kemudian, saya hanya meneruskan oenology_get_context()sebagai parameter, misalnya:

get_template_part( 'loop', oenology_get_context() );

Saya pikir sesuatu di sepanjang garis ini akan menjadi kandidat inti yang baik, meskipun saya tidak yakin cara terbaik untuk mengimplementasikannya. Saya ingin sekali mengirimkan tambalan.

Chip Bennett
sumber
wow chip. itu sangat, sangat licin. dan use case Anda persis seperti yang saya maksudkan. sejauh tambalan, mengapa Anda tidak hanya mendaftarkan hak global ini pada saat yang sama saat Anda melangkah melalui template loader?
Helgatheviking
1
Karena saya tidak yakin jika menambahkan global lain akan menjadi pendekatan "diberkati" untuk inti. Mungkin fungsi yang mengembalikan konteks sebagai string akan lebih baik - tetapi kemudian, itu mungkin membutuhkan sedikit penulisan ulang template-loader.php.
Chip Bennett
+1 bagus. Hanya satu catatan: indextidak akan pernah cocok, sebagai salah satu is_front_page()atau is_home()akan memicu.
kaiser
1
Hal lain: is_home()harus menjadi yang pertama, karena memberi kembali front-pagebahkan ketika pengaturan "posting terbaru" diaktifkan dan tidak ada halaman depan hadir. Baru diuji.
kaiser
Setuju dengan @iser. Anda bahkan dapat menggunakannya is_home() && 'page', tergantung kebutuhan. Untuk informasi yang lebih luas tentang Posting Blog vs Halaman Statis di Halaman Depan, lihat jawaban saya sendiri, di sini: wordpress.stackexchange.com/questions/208503/… . BTW, @Chip, dan @helgatheviking, akan lebih baik menggunakan use switchdaripada banyak elseif(ini lebih efisien ;-). Salam!
Gerard
4

sedikit facepalm, karena jawabannya adalah dalam PHP murni

$path_parts = pathinfo(__FILE__);
//var_dump($path_parts); 
echo $path_parts['filename'];
helgatheviking
sumber
2

Jika Anda melihat kode sumber get_template_partfungsi, Anda akan melihat:

function get_template_part( $slug, $name = null ) {
    do_action( "get_template_part_{$slug}", $slug, $name );

    $templates = array();
    if ( isset($name) )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";

    locate_template($templates, true, false);
}

Ini menciptakan array 2 nama template: {$slug}-{$name}.phpdan {$slug}.phpdan gunakan load_templateuntuk menemukan file template dan memasukkannya (parameter ke-2 adalah true, yang berarti termasuk file itu).

Anda dapat meniru fungsi ini untuk mengembalikan jalur file templat alih-alih menyertakannya, seperti:

function my_get_template_part( $slug, $name = null, $include = false ) {
    do_action( "get_template_part_{$slug}", $slug, $name );

    $templates = array();
    if ( isset($name) )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";

    return locate_template($templates, $include, false);
}

Pemakaian:

// Don't load the template
$template = my_get_template_part( 'loop', 'archive', false );

// Or load the template
$template = my_get_template_part( 'loop', 'archive', true );

// Get the file name only
$template = basename( $template );

// Without .php extension
$template = substr( $template, 0, -4 );

Anda dapat bermain lebih banyak dengan $templateuntuk mendapatkan apa yang Anda inginkan.

Anh Tran
sumber
itu cukup rapi! +1 pasti, tetapi saya perlu tahu info $ template di dalam template loop-arhive.php (untuk mengikuti contoh Anda)
helgatheviking
Anda dapat menggunakan variabel global yang diatur archive.php, dan menggunakannya kembali dalamloop-archive.php
Anh Tran
2

Daftar semua persyaratan yang ada true

Karena semua is_*()fungsi memiliki padanannya dalam variabel kueri (fungsinya hanya pembungkus), Anda dapat mengaksesnya juga dengan cara lain: Dapatkan semua yang ada true.

Saya menulis tiket pada core / trac yang menambahkan fungsi untuk mendaftar semuanya.

Sementara itu, Anda dapat menggunakan kedua fungsi yang terdaftar sebagai plugin pembantu yang menunjukkan kepada Anda permintaan mana yang tersedia. Ini akan mencetak di var_dump()bawah footer (baik admin & publik) di shutdownhook.

<?php
/** Plugin Name: (#62232) »kaiser« List all conditionals that are true */
function get_conditionals()
{ 
    global $wp_query; 

    foreach ( get_object_vars( $wp_query ) as $is_key => $is_value ) 
    { 
            if ( $is_value && preg_match( "/is_/", $is_key ) ) 
                    $conditionals[] = $is_key; 
    } 

    return var_dump( $conditionals );
} 
add_action( 'shutdown', 'get_conditionals' );

Dengan cara ini Anda dapat dengan mudah memutarnya.

@scribu menambahkan fungsinya sendiri ke tiket (solusi yang menarik juga).

   

<?php
/** Plugin Name: (#62232) »scribu« List all conditionals that are true */
function get_query_flags( $wp_query = null ) {
    if ( !$wp_query )
        $wp_query = $GLOBALS['wp_query'];

    $flags = array();

    foreach ( get_object_vars( $wp_query ) as $key => $val ) {
        if ( 'is_' == substr( $key, 0, 3 ) && $val )
            $flags[] = substr( $key, 3 );
    }

    return var_dump( $flags );
}
add_action( 'shutdown', 'get_query_flags' );

Performa

Saya menjalankan tes kinerja pada setiap fungsi di tengah menggunakan template timer_start/*_stop();. Agar adil, saya mengganti nama semua fungsi menjadi nama satu karakter a/b/c().

Seperti yang Anda lihat, fungsi kode keras Chips paling cepat, lalu menjadi milik saya dan yang terakhir adalah dalam hal ini scribus.

masukkan deskripsi gambar di sini

Memperbarui

Jika Anda mengenal saya, maka Anda tahu cintaku pada iterator karena keanggunan, kejelasan, dan kemampuan mereka untuk hanya menyimpan satu item dalam memori alih-alih salinan seluruh array saat mengulang. Jadi, inilah kelas kustom cepat yang meluas \FilterIterator, karenanya hanya membutuhkan satu metode tunggal yang dikerjakan ulang.

<?php

namespace WPSE;

class ConditionalsFilter extends \FilterIterator
{
    /**
     * Accepts properties that start with `is_` and have a positive boolean value
     * @return bool
     */
    public function accept()
    {
        return 0 === strncasecmp( $this->key(), 'is_', 3 )
            and filter_var(
                $this->current(),
                FILTER_VALIDATE_BOOLEAN,
                FILTER_NULL_ON_FAILURE
            );
    }
}

Ini dapat digunakan dengan cukup mudah. The $it->current()memegang nilai, sedangkan $it->key()pengembalian nama bersyarat / properti.

$cond = new WPSE\ConditionalsFilter( new \ArrayIterator(
    get_object_vars( $GLOBALS['wp_query'] )
) );
foreach ( $cond as $c )
{
    var_dump(
        $cond->key(),
        $cond->current()
    );
}
kaisar
sumber
1
Ya itu sangat pintar. Terima kasih! Saya harus mengunjungi kembali ini ketika saya selesai dengan beberapa hal lain yang sedang saya kerjakan. Juga, sangat sulit untuk mengingat untuk memanfaatkan! Kebiasaan buruk sulit untuk dihilangkan.
Helgatheviking