Tải mẫu trang bên ngoài và tập lệnh enqueue từ plugin gây ra lỗi 403 bị cấm


7

Tôi có một plugin tạo bảng điều khiển trên trang sau:

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

Tôi muốn sử dụng bảng này trên trang sau

mysite.com/mypanel

Giải pháp mà tôi đã thử là sử dụng mypanel.phplàm mẫu trang như dưới đây:

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;
}

Bằng cách này, trang sẽ hiển thị nhưng không có javascript nào hoạt động. Vì vậy, tôi đã cố gắng nhập javascript của plugin trong các chức năng 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');
    }

}

Mà kết quả 403 lỗi bị cấm. Tôi đã thêm thử thêm thư mục .htaccess vào trang của plugin nhưng nó vẫn tiếp tục báo lỗi.

Xin vui lòng cho tôi biết đâu là cách chính xác để giải quyết vấn đề này.

EDIT: Sau một số câu trả lời dưới đây (cảm ơn mọi người). Tôi đã chuyển mã của mình sang trang của plugin và không còn lỗi 403 bị cấm. Nhưng các nút của tôi không hoạt động và tôi cảm thấy như tệp js của tôi không chạy trên trang.

Tập tin js của tôi bắt đầu bằng: jQuery(document).ready(function()

Đây là mã cuối cùng trên trang của 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' ));        
    }    
}

Bạn có chắc chắn rằng máy chủ của bạn không chặn quyền truy cập vào tập lệnh của bạn thông qua .htaccesstệp không? Ngoài ra, hãy thử sử dụng plugins url()để có được đường dẫn đến thư mục plugin của bạn và xem nếu nó giúp.
Jack Johansson

1
Xin chào, tại sao bạn nghĩ plugins_url sẽ hoạt động? Nó chỉ trả về đường dẫn như chuỗi phải không? @JackJohansson, tôi đã thử giải pháp sau: stackoverflow.com/a/37559573/1235655
HOY

1
Chào. Đường dẫn tuyệt đối và URL được tiếp cận khác nhau bởi máy chủ. Như bạn có thể thấy, đã có 2 câu trả lời cho câu hỏi của bạn dựa trên nhận xét của tôi, vì vậy tôi khuyên bạn nên dùng thử và cập nhật câu hỏi với kết quả đầu ra.
Jack Johansson

Câu trả lời:


5

MÃ của bạn vẫn ổn, lý do bạn nhận được lỗi 403 là vì $_SERVER['DOCUMENT_ROOT']trả về PATH tuyệt đối cho gốc web của bạn chứ không phải URL.

JavaScript cần phải được thêm dưới dạng URL. Vì vậy, bạn có thể sử dụng Load_Template_Scripts_wpa83855chức năng trong plugin của mình và sau đó sử dụng:

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

MÃ để thêm JavaScript.

Lưu ý: rõ ràng bạn có thể làm cho CODE thậm chí tốt hơn bằng cách sử dụng logic như những gì @nathan đã sử dụng trong câu trả lời của mình , tức là thêm:

add_action('wp_enqueue_scripts','Load_Template_Scripts_wpa83855');

trong wpa3396_page_template()hàm trong if ( is_page( 'mypanel' ) ) {}khối điều kiện; nhưng đó không phải là lý do của lỗi. Trình duyệt PATH không thể được truy cập bởi trình duyệt, đó là lý do tại sao máy chủ trả về Access Forbiddenlỗi.

MÃ đầy đủ (Cập nhật):

Dưới đây là CODE đầy đủ để thuận tiện cho bạn (thêm nó vào tệp plugin chính của bạn):

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' ) );
}

Lỗi 403 không còn nhưng không có gì xảy ra, các nút không hoạt động, tệp js của tôi bắt đầu như thế này: jQuery (tài liệu). Đã (hàm () ... có nghĩa là nó sẽ không hoạt động nếu tôi thêm thủ công sau đó? Tôi có thể khắc phục điều này không?
HOY

Bạn cũng phải tải tập lệnh của mình sau jQuery. Bạn có thể làm như vậy bằng cách sử dụng : wp_enqueue_script( 'wtd', plugins_url( '/js/wtd.js' , __FILE__ ), array( 'jquery' ) );. CODE này yêu cầu WordPress tải tập lệnh của bạn sau jQuery. Ngoài ra, plugins_url()chức năng sẽ không hoạt động trong functions.phptệp chủ đề của bạn , hãy thêm CODE đó vào tệp plugin chính của bạn, như tôi đã nói trước đây.
Fayaz

Tôi đã sử dụng như bạn đã đề cập nhưng nó không ảnh hưởng, bạn có thể vui lòng kiểm tra EDIT tôi đã thực hiện cho câu hỏi của tôi ở phía dưới Nếu tôi không thiếu thứ gì không? @Fayaz
HOY

1
CODE của bạn sẽ hoạt động nếu: (1) bạn có tất cả các tệp & CODE ở vị trí thích hợp (2) Không có lỗi trong JavaScript của bạn (kiểm tra trong bảng điều khiển và xem nguồn nếu tệp JS đang tải) (3)/includes/tshirt-designer-design-template.php tệp mẫu của bạn có gọi đến wp_head()chức năng WordPress ngay trước </head>thẻ kết thúc HTML và wp_footer()gọi ngay trước khi kết thúc </body>thẻ. Nếu không có hai chức năng này, các kịch bản & kiểu chân trang sẽ không tải.
Fayaz

1

Nếu bạn đã có hoặc đang có kế hoạch để có một trang có tên 'mypanel', thì bạn có thể sử dụng page_templatebộ lọc để lọc mẫu được sử dụng trên trang đó. Tôi cho rằng đó là những gì bạn đang làm.

Chúng tôi có thể sử dụng page_templatebộ lọc để sử dụng một mẫu tùy chỉnh cho trang này. Trong khi sử dụng bộ lọc này, chúng tôi có thể thêm một hành động để liệt kê các tập lệnh cụ thể cho trang này.

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__ ) );
}

Trong /includes/mypanel.phptệp mẫu, đảm bảo gọi wp_head()wp_footer()nếu không các tập lệnh được xử lý sẽ không được in.


1
Vui lòng sửa CODE của bạn, $page_templatephải là đường dẫn, không phải URL.
Fayaz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.