Parte do modelo dentro do shortcode, resultado inesperado

Aug 16 2020

Estou tentando chamar uma parte do modelo por meio de um shortcode. Eu li tudo sobre como fazer isso várias vezes neste site e mesmo assim, depois de tentar várias coisas, ainda não consigo chamar uma string de tempo de eco de php simples. O nome do arquivo é test-one.php. Aqui está o que eu tentei:

function test_2( $attr ) {
    ob_start();
    get_template_part( 'test', 'one' );
    return ob_get_clean();
}

add_shortcode('test2', 'test_2');

function test_2( $attr ) {
    ob_start();
    get_template_part( 'test-one' );
    return ob_get_clean();
}
add_shortcode('test2', 'test_2');

function test_2( $attr ) {
    ob_start();
    get_template_part( 'wp-content/themes/theme-name/template-parts/test-one' );
    return ob_get_clean();
}

add_shortcode('test2', 'test_2');

O código da peça do modelo é

<?php

echo "Current as of <br>  ".date("m-d-Y h:i:sa");

Parece que deve funcionar, não? Onde eu estou errando?

Respostas

2 Howdy_McGee Aug 17 2020 at 00:25

A get_template_part()função não assume nenhum nome de diretório, você deve fornecê-lo explicitamente. Também é relativo ao diretório do tema ativo. Então, em muitos de seus exemplos, ele estava procurando o modelo na raiz do seu tema ativo. O formato correto seria:

get_template_part( 'template-parts/test-one' );

Se você quiser, pode renomear a pasta para incou includes- é arbitrário. Você só precisa refletir essa mudança na chamada de função.


Em uma nota lateral, o WordPress permite que você passe um segundo parâmetro e procurará arquivos unidos por um travessão. Por exemplo, isso também funcionará:

get_template_part( 'template-parts/test', 'one' );

A vantagem disso é que permite que você tenha vários "tipos" de uma peça específica. Você pode ter um content-post.phparquivo para a saída do conteúdo da sua postagem e um arquivo para content-page.phpa saída do conteúdo da página. Então, em seu tema, você pode chamar seu modelo por:

get_template_part( 'template-parts/content', $post->post_type );

Apenas permite que seja um pouco mais dinâmico.


Outra nota lateral. Sempre que você tiver problemas com esses tipos de funções, poderá usar:

add_action( 'init', function() {
    $template = locate_template( $template_string_here ); printf( '<pre>%s</pre>', print_r( $template, 1 ) );
    die( 'end' );
} );

Isso gerará o caminho do modelo pelo qual o WordPress está tentando acessar o modelo.