it-swarm-pt.tech

Carregar o modelo de página externa e o script de enfileiramento do plug-in causa 403 erros proibidos

Eu tenho um plugin, que cria um painel na seguinte página:

mysite.com/wp-content/plugins/myplugin/includes/mypanel.php

Eu quero usar este painel na próxima página

mysite.com/mypanel

A solução que tentei foi usar mypanel.php como modelo de página, conforme abaixo:

add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
    if ( is_page( 'mypanel' ) ) {
        $page_template = dirname( __FILE__ ) . '/includes/mypanel.php';
    }
    return $page_template;
}

Desta forma, a página é exibida, mas nenhum dos javascript funciona. Então eu tentei importar o plugin javascript em funções php.

add_action('wp_enqueue_scripts','Load_Template_Scripts_wpa83855');
function Load_Template_Scripts_wpa83855(){

    if ( strpos(get_page_template(), 'mypanel.php') !== false ) {
        wp_enqueue_script('wtd', $_SERVER['DOCUMENT_ROOT'].'/wp-content/plugins/myplugin/js/wtd.js');
    }

}

Que resultou 403 erro proibido. Eu adicionei tentei adicionar uma pasta .htaccess na página do plugin, mas continuou a dar erro.

Por favor, diga-me qual é a maneira correta de resolver este problema.

EDIT: Depois de algumas respostas abaixo (obrigado a todos). Mudei meus códigos para a página do meu plugin, e não mais erro 403 proibido. Mas meus botões não estão funcionando, e sinto que meu arquivo js não passa pela página.

Meu arquivo js começa com: jQuery(document).ready(function()

Aqui o código final na página do plugin:

/* Make tisort-tasarla page as template */
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
    if ( is_page( 'tisort-tasarla' ) ) {
        $page_template = dirname( __FILE__ ) . '/includes/tshirt-designer-design-template.php';
    }
    return $page_template;
}
/* Add Javascript to T-Shirt Design Page */

add_action('wp_enqueue_scripts','Load_Template_Scripts_wpa83855');
function Load_Template_Scripts_wpa83855(){

    if ( is_page( 'tisort-tasarla' ) ) {
        wp_enqueue_script( 'wtd', plugins_url( '/js/wtd.js' , __FILE__ ), array( 'jquery' ));        
    }    
}
7
HOY

Seu CÓDIGO é bom, a razão pela qual você está recebendo erro 403 é porque $_SERVER['DOCUMENT_ROOT'] retorna PATH absoluto para sua raiz da web, não URL.

JavaScript precisa ser adicionado como URL. Então, você pode usar a função Load_Template_Scripts_wpa83855 no seu plugin e então usar:

wp_enqueue_script( 'wtd', plugins_url( '/js/wtd.js' , __FILE__ ) );

CÓDIGO para adicionar JavaScript.

Note:obviamente você pode tornar o CODE ainda melhor usando lógica como @nathan usado em sua resposta , ou seja, adicionando:

add_action('wp_enqueue_scripts','Load_Template_Scripts_wpa83855');

dentro da função wpa3396_page_template() no bloco de condição if ( is_page( 'mypanel' ) ) {}; mas essa não é a razão do erro. O PATH do servidor não pode ser acessado pelo navegador, é por isso que o servidor retorna o erro Access Forbidden.

CÓDIGO COMPLETO (Atualizado):

Aqui está o CÓDIGO completo para sua conveniência (adicione-o no seu arquivo principal do plugin):

add_filter( 'page_template', 'wpse_262042_page_template' );
function wpse_262042_page_template( $page_template ) {
    if( is_page( 'mypanel' ) ) {
        add_action( 'wp_enqueue_scripts', 'wpse_262042_enqueue_scripts' );
        $page_template = plugin_dir_path( __FILE__ ) . 'includes/mypanel.php';
    }
    return $page_template;
}

function wpse_262042_enqueue_scripts() {
    wp_enqueue_script( 'wtd', plugins_url( 'js/wtd.js' , __FILE__ ), array( 'jquery' ) );
}
5
Fayaz

Se você já tem, ou planeja ter, uma página chamada 'mypanel', você pode usar o filtro page_template para filtrar o modelo usado nessa página. Estou assumindo que é isso que você está fazendo.

Podemos usar o filtro page_template para usar um modelo personalizado para esta página. Ao usar esse filtro, podemos adicionar uma ação para enfileirar scripts específicos para esta página.

add_filter( 'page_template', 'wpse_262042_page_template', 10, 1 );
function wpse_262042_page_template( $page_template ) {
  if( is_page( 'mypanel' ) ) {
    add_action( 'wp_enqueue_scripts', 'wpse_262042_enqueue_scripts' );
    $page_template = plugin_dir_path( __FILE__ ) . 'includes/mypanel.php';
  }
  return $page_template;
}
function wpse_262042_enqueue_scripts() {
  wp_enqueue_script( 'wpse-262042', plugins_url( '/js/wpse-262042.js', __FILE__ ) );
}

No arquivo de modelo /includes/mypanel.php, certifique-se de chamar wp_head() e wp_footer(), caso contrário os scripts enfileirados não serão impressos.

1
Nathan Johnson