Como incluir um arquivo usando get_template_part () em um plugin?

13

Uma pergunta muito simples pode ser, mas estou lutando. No desenvolvimento de temas, trabalhei get_template_part()muitas vezes e entendo seus princípios. Mas, quando estou desenvolvendo um plugin, imaginei usá-lo, mostrando-me alguns erros:

Aviso: Uso da constante indefinida STYLESHEETPATH - assumida 'STYLESHEETPATH' na ...\wp-includes\template.phplinha 407

e

Aviso: Uso da constante indefinida TEMPLATEPATH - assumida 'TEMPLATEPATH' na ...\wp-includes\template.phplinha 410

A pesquisa do problema no Google mostrou uma correção de suporte:

Mas isso parece uma solução alternativa enorme - duvido. Eu acho que isso não deve ser muito complicado. Eu verifiquei esta resposta WPSE e encontrei esta linha de código:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

Onde existe uma include()função PHP . De acordo com meu conhecimento do WordPress, aprendi a preferir get_template_part()ao PHP include(). Então, como exatamente eu posso usar um simples get_template_part()no meu plugin.

Não estou usando nenhum loop ou algo assim, estou apenas separando (ou você pode organizar) meu código de plug-in em arquivos diferentes, de modo que, em alguns casos, eu os comentei simplesmente para soltar onde não são necessários. Eu tentei:

get_template_part( 'my', 'special-admin' );

e depois do erro, altere-o para:

get_template_part( 'my', 'specialadmin' );

Mas você sabe que não é esse o problema. Estou no servidor local, usando WAMP.

Mayeenul Islam
fonte

Respostas:

11

get_template_parté uma função de tema . Você não pode carregar arquivos de plug-in com essa função. Dê uma olhada na fonte e você notará que o trabalho é feito locate_template. Olhe para essa fonte e você verá que ela sempre carrega dos diretórios de temas .

Por mais que você queira usá- get_template_partlo, esta é a função errada.

Você precisará dos includeseus arquivos.

A razão, pelo que me parece, get_template_parté permitir que os temas sejam estendidos - ou seja, facilitar a criação de temas filhos. Os plug-ins não devem ser estendidos dessa forma, portanto não há necessidade get_template_partou equivalente a nenhum plug-in.

s_ha_dum
fonte
6

@s_ha_dum está correto, pois get_template_parté uma função de tema, mas ele está incorreto, pois os plugins não devem ser estendidos dessa maneira. É simplesmente mais complicado.

Esta postagem de Pippin descreve como usar uma função que fará o trabalho de carregar seus modelos de plug-in, enquanto permite que os usuários substituam seus modelos de plug-in dentro do seu tema.

Essencialmente, ele aparece em uma pasta especial no tema e, se não for encontrado, procura na pasta de modelos o plugin.

benklocek
fonte
4

Como foi dito antes, você não pode usar get_template_partplugins, mas há uma classe útil no Github (criada por Gary Jones) que imita a get_template_partfuncionalidade dos plugins, adicionando o plug-in ao fallback (tema filho> tema pai> plugin).

Dessa forma, você pode substituir a "parte do modelo" do seu plug-in dentro de um tema filho ou de um tema pai.

Uso (extraído das instruções do repositório do Github):

  1. Copie class-gamajo-template-loader.phppara o seu plugin. Pode estar em um arquivo na raiz do plugin, ou melhor, em um diretório include.
  2. Crie um novo arquivo, como class-your-plugin-template-loader.php, no mesmo diretório.
  3. Crie um classarquivo que se estenda Gamajo_Template_Loader.
  4. Substitua as propriedades da classe para se adequar ao seu plug-in. Você também pode substituir o get_templates_dir()método se não for adequado para você.
  5. Agora você pode instanciar sua classe do carregador de modelos personalizado e usá-la para chamar o get_template_part()método Isso pode estar dentro de um retorno de chamada em código curto ou em algo que você deseja que os desenvolvedores de temas incluam em seus arquivos.

Código de exemplo:

// Template loader instantiated elsewhere, such as the main plugin file.
$meal_planner_template_loader = new Meal_Planner_Template_Loader;

// Use it to call the get_template_part() method. This could be within 
// a shortcode callback, or something you want theme developers 
// to include in their files.
$meal_planner_template_loader->get_template_part( 'recipe' );

// If you want to pass data to the template, call the set_template_data() 
// method with an array before calling get_template_part().        
// set_template_data() returns the loader object to allow for method chaining.
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data );
    ->get_template_part( 'recipe' );

// The value of bar is now available inside the recipe template as $data->foo.
// If you wish to use a different variable name, add a second parameter 
// to set_template_data():
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data, 'context' )
    ->get_template_part( 'recipe', 'ingredients' );

// The value of bar is now available inside the recipe template as $context->foo.
Marcio Duarte
fonte