Use um arquivo de modelo para um URL específico sem criar uma página

14

Gostaria de saber se é possível usar um arquivo de modelo para um URL específico sem ter que criar uma página para esse modelo.

Este é o meu problema simplificado:

Criei uma página no WP com algum conteúdo de link que aponta para um URL específico com alguns dados de formulário à direita: (mysite.com/retail/?a=test&b=1234) .

Quero que esse URL (varejo) use automaticamente meu arquivo de modelo template-retail.php que eu tenho no diretório de temas filho, sem precisar criar uma página chamada "retail" e selecionar a página de modelo a partir daí. Há apenas conteúdo externo no arquivo template-retail.php, nada do próprio Wordpress.

Isso é possível?

Keat
fonte
1
Você precisaria criar um redirecionamento do HTAccess para o arquivo e processar a solicitação lá.
Howdy_McGee
Eu não tenho acesso ao arquivo .htaccess neste caso. Existe alguma outra maneira?
Keat
existem plugins que podem lhe dar acesso para fazer esse tipo de coisa, de qualquer maneira você precisará fazer upload de um arquivo personalizado no servidor para que ele tenha algo a ser atingido.
Howdy_McGee
4
Não tenho certeza sobre todos os detalhes do seu projeto, mas as primeiras coisas que vêm à mente são template_redirectou um endpoint
s_ha_dum

Respostas:

15

Você pode apenas olhar para o URL, carregar o arquivo e sair.

Isso pode ser feito quando o WordPress carregou seu ambiente, por exemplo, ativado 'init'.

add_action('init', function() {
  $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/');
  if ( $url_path === 'retail' ) {
     // load the file if exists
     $load = locate_template('template-retail.php', true);
     if ($load) {
        exit(); // just exit if template was found and loaded
     }
  }
});

Observe que, para isso, uma página real com slug "retail" nunca pode ser usada.

Isso é muito fácil, mas também codificado, então se você precisar disso para uma única página, tudo bem. Se você precisar controlar mais URLs, consulte a solução proposta nesta resposta .

gmazzap
fonte
Obrigado pela sua resposta. Não consigo obter o código acima para funcionar. Isso nunca é verdade: "if ($ url_path === 'retail') {" O $ url_path é uma string com o valor: " example.com/retail "
Keat
Tente var_dump($url_path);ver como ela se parece e ajuste o código. Esse valor depende do seu URL real . Por exemplo, para URL doméstico personalizado ou WP instalado na subpasta pode ser diferente. @Keat
gmazzap
1
Obrigado pela resposta e desculpe pela resposta tardia. Eu usei esta solução e ela funciona perfeita. $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/'); $templatename = 'retail'; $pos = strpos($url_path, $templatename); if ($pos !== false) {
Keat
5

A initação não é apropriada para o que você está tentando alcançar. Você deveria estar usando o template_includefiltro. Você combinaria isso com get_query_varpara recuperar os parâmetros de URL e verificar qual modelo precisa ser carregado. Aqui estão os links:

Código:

add_filter( 'template_include', 'portfolio_page_template', 99 );

function portfolio_page_template( $template ) {

    if ( is_page( 'portfolio' )  ) {
        $new_template = locate_template( array( 'portfolio-page-template.php' ) );
        if ( '' != $new_template ) {
            return $new_template ;
        }
    }

    return $template;
}
adamj
fonte
1

A maneira do WordPress de fazer isso é com page-templates. https://developer.wordpress.org/themes/template-files-section/page-template-files/

Você só precisa de um código para o modelo do WordPress. No seu tema WordPress, você pode criar um modelo de página e renomeá-lo para

page-id.php

Essa página em particular irá buscá-la automaticamente e usar o modelo.

Por exemplo, se sua página tiver um ID 5874, você nomeará o modelo como page-5784.php

Você também pode nomear o modelo com base no slug da página. Por exemplo, se o slug da página for hello-world, o nome do modelo serápage-hello-world.php

Veja também: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png

Shivanand Sharma
fonte
0

@ shivanand-sharma este é o método perfeito e mais limpo ( https://developer.wordpress.org/themes/template-files-section/page-template-files/ ) para criar qualquer página como qualquer outra no wordpress, e se você quiser para ocultar sua página, basta usar o plug-in simples e eficaz ' https://wordpress.org/plugins/exclude-pages/ '

Devo dizer que eu precisava de um URL para criar POST ou GET em minha própria página e salvar alguns dados da sessão 'WC () -> session', e isso resolve esse e outros problemas, porque você pode ter uma espinha dorsal personalizada código php, incluindo todos os 'require (' wp-load ') etc' de todo o wordpress, woocommerce etc. para trabalhar com, mysite.com/index.php/MYPAGE .....

Você só precisa:

Primeiro: Crie um arquivo dentro da localização do tema como modelo da nova página, algo como 'wp-content / themes / mytheme / customtemplate.php' (o comentário é importante para que o 'Template Name' possa ser observado pelo Wordpress):

<?php /* Template Name: WhateverName */ 
echo 'Hello World';echo '</br>';
var_dump(WC()->session); 
var_dump($_POST);
var_dump($_GET);
?>

Segundo: Crie uma página no wordpress normalmente através de 'wp-admin'> Páginas (digamos um nome como MYPAGE , ou você pode alterar a lesma o que quiser) e, claro, vincule o modelo anterior como o modelo desta página, que é o nome 'WhateverName' na seção de atributos do modelo.

Então, vamos abrir a nova página 'mysite.com/index.php/MYPAGE' e você verá.

Hello World
object(WC_Session_Handler)#880 .....................

Extras: Vamos criar funções javascript ou jquery no carrinho, checkout, o que você puder imaginar dentro das tags HTML 'script' e incluir código como este:

var data = { action : actionName, dataA : etcA, dataB : etcB}
$.ajax({
    type:     'post',
    url:      'index.php/MYPAGE',
    data:     data,
    success:  function( response ) {
    },
    complete: function() {
    }
});
Jose Velandia
fonte