Đang tải tập lệnh bên ngoài trong quản trị nhưng CHỈ cho một loại bài cụ thể?


16

Vì vậy, tôi tiếp tục gặp vấn đề này và tôi chỉ tìm giải pháp tốt nhất và đơn giản nhất để giải quyết vấn đề này.

Tôi đã đến để sử dụng các loại bài đăng tùy chỉnh trong nhiều dự án khác nhau và đã mở rộng chúng bằng các metabox tùy chỉnh mà sau đó tôi đã mở rộng thêm bằng cách thêm các tập lệnh tùy chỉnh như bộ chọn lịch sự kiện jQuery ... Tất cả đều hoạt động tốt ngoại trừ một vấn đề chính ... Tôi không muốn các tập lệnh jQuery tùy chỉnh này tải trên mỗi trang trong quản trị viên.

Về cơ bản, tôi chỉ tìm cách để có các trường jquery tùy chỉnh này được tải khi tôi ở trang "chỉnh sửa bài đăng" cho loại bài đăng CỤ THỂ.

Giải pháp tốt nhất ở đây là gì?


CẬP NHẬT 1

Trước hết, cảm ơn bạn rất nhiều.

Tôi thực sự bị sốc khi các nhà phát triển plugin không đảm bảo những thứ như thế này bởi vì tôi đang tìm hiểu đây là một trong những lý do chính khiến các vấn đề tồn tại với các plugin khác nhau.

Tôi đang có một số vấn đề hơn nữa mặc dù với điều này. Ví dụ...

Tôi đã sửa đổi tập lệnh để gọi câu lệnh if như thế này:

if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events')

Như bạn có thể thấy tôi đang cố gắng thiết lập mọi thứ để các tập lệnh của tôi CHỈ được gọi khi tôi thêm hoặc chỉnh sửa một bài đăng trong loại bài "sự kiện".

Tôi không muốn tập lệnh tải trên bất kỳ trang nào khác và cũng không muốn tập lệnh chạy trên danh sách trang trong loại bài "sự kiện" vì vậy tôi sẽ nghĩ câu lệnh if là chính xác.

Tuy nhiên, vấn đề có vẻ là tập lệnh chỉ được tải khi tôi tạo một bài đăng mới trong loại bài đăng này nhưng nó dường như không hoạt động khi tôi đang chỉnh sửa một bài đăng hiện có.

Bạn có thể kiểm tra điều này và có thể cho tôi biết những gì tôi có thể làm sai?

Đây là mã chính xác mà tôi đang sử dụng ... có thể có cách tốt hơn hoặc đơn giản hơn để làm điều này?

<?php
// INCLUDE METABOX CUSTOM JQUERY DATEPICKER 2
add_action('admin_init','load_admin_datapicker_script');
function load_admin_datapicker_script() {
  global $pagenow, $typenow;
  if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {
    $ss_url = get_bloginfo('stylesheet_directory');
    wp_enqueue_script('jquery');
    wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
    wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
    wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
    wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
    wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
  }
}

Ngoài ra ... nếu tôi muốn thêm ba loại bài đăng và tải các tập lệnh JS khác nhau cho mỗi loại bài đăng thì tôi sẽ chỉ sao chép mã trên ba lần riêng biệt hay đây không phải là một cách tốt để làm điều này? Ví dụ ... sẽ tốt hơn nếu chỉ gọi: toàn cầu $ pagenow, $ typenow; Ở đầu tập tin chức năng của tôi hoặc nó có vấn đề hoặc phức tạp hóa mọi thứ khi tôi sao chép nó nhiều lần?

Về một vấn đề khác liên quan đến cùng một vấn đề ... Ví dụ, tôi đang sử dụng plugin "hình thức trọng lực" nhưng tôi nhận thấy các tập lệnh của họ chạy trên mọi trang trên quản trị viên đang gây ra sự cố với các plugin khác. Làm thế nào tôi có thể sửa đổi tập lệnh của họ để đảm bảo tập lệnh chỉ được tải khi tôi cần.


CẬP NHẬT 2

Tôi đã sửa đổi tệp tin.php của mình với mã do Mike cung cấp (bên dưới) tuy nhiên có vẻ như javascript có thể áp dụng vẫn được đưa vào khi bạn tạo Bài đăng hoặc Trang MỚI. Điều này có nghĩa là khi bạn cố gắng tạo một Bài đăng hoặc Trang MỚI bằng cách tạo một bài đăng / trang wordpress mặc định mới hoặc khi bạn tạo một bài đăng / trang MỚI dựa trên một trong các loại bài đăng tùy chỉnh của bạn. Mã được đề xuất bởi Mike IS hoạt động trên tất cả các trang quản trị khác và nó KHÔNG hoạt động khi bạn "EDIT" một bài đăng / trang hiện có hoặc loại bài đăng tùy chỉnh. Bất kỳ sửa đổi đề nghị để làm cho công việc này chính xác?

Đây là mã hiện tại của tôi:

<?php
   add_action('admin_init','load_admin_datapicker_script');
   function load_admin_datapicker_script() {
    global $pagenow, $typenow;
    if (empty($typenow) && !empty($_GET['post'])) {
        $post = get_post($_GET['post']);
        $typenow = $post->post_type;
    }
    if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {
        $ss_url = get_bloginfo('stylesheet_directory');
        wp_enqueue_script('jquery');
        wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
        wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
        wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
        wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
        wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
    }
   }
?> 

2
@ NetConstuctor.com: Đừng sốc, nhiều người viết plugin đã học lập trình để họ có thể viết plugin và do đó có rất ít nền tảng lập trình. Họ đang gãi ngứa, không tuân theo các thực hành tốt nhất.
MikeSchinkel

Câu trả lời:


14

Đầu tiên, tôi giả sử bạn đang sử dụng wp_enqueue_script()để tải tập lệnh của mình , phải không?

Điều đó nói rằng, nếu tôi hiểu câu hỏi của bạn thì những gì bạn cần là một cái gì đó như sau . Tất nhiên, bạn sẽ phải chỉnh sửa nó để biết chi tiết, nhưng nó cung cấp cho bạn khuôn khổ chung.

Chúng tôi đang kết nối admin_initvới chức năng load_my_script()để kiểm tra toàn cầu $pagenowvề sự phù hợp với trang quản trị edit.phpvà toàn cầu $typenowđể xem loại bài đăng có phải là loại bạn muốn không.

Phần còn lại chỉ là chi tiết mà bạn có thể đọc về đây nếu bạn cần tìm hiểu thêm:

<?php
add_action('admin_init','load_my_script');
function load_my_script() {
  global $pagenow, $typenow;
  if ($pagenow=='edit.php' && $typenow=='my-custom-type') {
    $ss_url = get_bloginfo('stylesheet_directory');
    wp_enqueue_script('jquery');
    wp_enqueue_script('my-custom-script',"{$ss_url}/js/my-custom-script.js",array('jquery'));
  }
}

CẬP NHẬT

Tôi đang trả lời cập nhật của bạn. Thật không may ( vì bất kỳ lý do gì ) $typenowkhông có giá trị trong suốt admin_initnên bạn sẽ cần lấy post_typebằng cách tải bài đăng dựa trên tham số URL 'post'như bạn thấy trong ví dụ sau (Tôi đã sao chép dòng trên và dòng dưới đây từ ví dụ của bạn để bạn có thể thấy nơi đặt nó):

<?php
global $pagenow, $typenow;
if (empty($typenow) && !empty($_GET['post'])) {
  $post = get_post($_GET['post']);
  $typenow = $post->post_type;
}
if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {

PS Đối với các câu hỏi khác của bạn, xin vui lòng gửi chúng dưới dạng câu hỏi mới trên trang web để tôi hoặc người khác trả lời. Vì chúng tôi đang làm việc rất chăm chỉ để giúp bạn, xin hãy cẩn thận để đặt tiêu đề của bạn một tiêu đề tốt nhất có thể và cũng xin vui lòng viết câu hỏi của bạn rõ ràng và ngắn gọn nhất có thể với định dạng tốt và tiếng Anh đúng. Nếu bạn sẽ làm điều này, nó sẽ giúp với các vấn đề tương tự nhận ra câu hỏi của bạn giống với những gì họ cần và nó sẽ giúp chúng tôi trả lời câu hỏi của bạn dễ dàng hơn.

Tôi hỏi bạn ( và tất cả những người khác đặt câu hỏi về Câu trả lời WordPress ) để đổi lấy việc dành thời gian để trả lời câu hỏi của bạn vì tôi và những người kiểm duyệt khác muốn biến Câu trả lời của WordPress thành một nguồn tài nguyên to lớn cho cộng đồng thay vì Một diễn đàn cẩu thả khác khó đọc và khó tìm câu trả lời như rất nhiều trang web khác trên web.

CẬP NHẬT # 2

Tôi nghĩ rằng bạn có thể đã có một vấn đề ưu tiên toán tử trong câu lệnh if của bạn nhưng khi tôi kiểm tra trước khi tôi không gặp phải nó. Nếu nó hoạt động như lời bạn nói thì bạn gần như chắc chắn làm điều đó thay vào đó (xin lỗi, tôi không có thời gian để kiểm tra điều này ngay bây giờ để đảm bảo chắc chắn rằng nó hoạt động):

<?php
add_action('admin_init','load_my_script');
function load_my_script() {
  global $pagenow, $typenow;
  if (empty($typenow) && !empty($_GET['post'])) {
    $post = get_post($_GET['post']);
    $typenow = $post->post_type;
  }
  if (is_admin() && $typenow=='events') {
    if ($pagenow=='post-new.php' OR $pagenow=='post.php') { 
      $ss_url = get_bloginfo('stylesheet_directory');
      wp_enqueue_script('jquery');
      wp_enqueue_script('my-custom-script',"{$ss_url}/js/my-custom-script.js",array('jquery'));
    }
  }
}

hi mike ... xem xét của tôi dưới đây ... xin lỗi, tôi gửi trong hộp sai
NetConstructor.com

@ NetConstuctor.com : Vui lòng không cung cấp làm rõ câu hỏi của bạn ở nơi được thiết kế để trả lời . Tôi đã chuyển nội dung bạn đưa vào câu trả lời vào câu hỏi của bạn và đang bỏ phiếu để đóng câu trả lời đó.
MikeSchinkel

Xin chào Mike ... mã của bạn hoạt động hoàn hảo ngoại trừ một vấn đề ... Khi bạn ở trang quản trị nơi bạn có thể thêm bài đăng mới hoặc trang mới (tôi đang nói về bài đăng / trang mặc định) mã javascript chỉ nên được tải cho loại bài tùy chỉnh DOES được tải. Ngoài vấn đề này, nó dường như đang hoạt động hoàn hảo và chỉ tải javascript trên các loại bài đăng được chỉ định. Bạn có bất kỳ sửa đổi bạn có thể đề nghị?
NetConstructor.com

Xin lỗi Mike - giả định ban đầu của tôi thực sự không chính xác. Có vẻ như mã bạn cung cấp IS đã bao gồm javascript trên các loại bài đăng khác mà tôi có. Tôi đã đi và bao gồm các kịch bản chính xác như bạn đã đề xuất. Bạn có thể vui lòng xem lại điều này một lần nữa?
NetConstructor.com

1
OK ... Vì vậy, sau khi xem xét thêm, tôi đã phát hiện ra rằng mã của Mike thực sự hoạt động chính xác ở mọi nơi trừ khi bạn tạo một bài đăng "MỚI". Từ những gì tôi đang thấy ở đây, javascript không chính xác được đưa vào khi bạn tạo TRANG MỚI, POST MỚI cho các trang / bài đăng wordpress mặc định cũng như bất kỳ loại bài đăng tùy chỉnh nào bạn có thể có. Mã IS đang hoạt động (không bao gồm javascript) khi bạn EDIT một bài đăng hoặc trang hiện có là một bài đăng hoặc trang wordpress mặc định hoặc một loại bài đăng tùy chỉnh. Ai đó có thể cung cấp một sửa đổi được đề xuất để khắc phục vấn đề này?
NetConstructor.com

3

Tôi nghĩ rằng tôi sẽ thêm một số mã ở đây đã giải quyết một vấn đề liên quan của tôi. Trong trường hợp của tôi, tôi đang cố gắng để JavaScript và css chỉ tải trên Trang và Bài đăng và (chỉnh sửa và tạo) và không ở đâu khác.

Tôi đã tìm thấy một giải pháp khả thi bằng cách sử dụng basename( $_SERVER[ 'SCRIPT_FILENAME' ] )để xác định vị trí của phần phụ trợ. Mặc dù vậy, tôi đã lo ngại vì tính khả dụng của $_SERVER[ 'SCRIPT_FILENAME' ]máy chủ có thể khác nhau đối với máy chủ (có ai biết khả năng nó $_SERVER[ 'SCRIPT_FILENAME' ]không khả dụng trên máy chủ không?)

Sau đó, tôi đã xem qua câu hỏi này và MikeSchinkel trả lời. Với một chút sửa đổi, tôi đã làm cho nó hoạt động với tôi ngoại trừ một điều. Dường như vì bất kỳ lý do gì khi một bài đăng mới được tạo thông qua "Thêm mới", nó không hoạt động.

Với các chỉnh sửa sau đây, tôi đã làm cho nó hoạt động và tôi chia sẻ nó ở đây với hy vọng giúp đỡ người khác và cải thiện nó.

add_action( 'admin_init','imp_add_admin_scripts' );

function imp_add_admin_scripts() {

 $urljs = get_bloginfo( 'template_directory' ).IMP_JS;
 $urlcss =get_bloginfo( 'template_directory' ).IMP_STYLES;

 // Register our scripts
 wp_register_script('imp_jquerytools', $urljs.'jquery/imp_tabs_jquery.tools.min.js' );
 wp_register_style( 'rpanel-css', $urlcss.'impoweradmin.css' );


 global $pagenow, $typenow;
 if ( empty( $typenow ) && !empty( $_GET['post'] ) ) {
  $post = get_post( $_GET['post'] );
  $typenow = $post->post_type;
 } elseif ( empty( $typenow ) && ( $pagenow == 'post-new.php' ) ){ 
  $typenow = 'post';
 }

 if ( is_admin() && ( ( $typenow == 'page') || ( $typenow == 'post') ) ){

  if ( $pagenow == 'post-new.php' OR $pagenow == 'post.php' ) {

   wp_enqueue_script( 'imp_jquerytools' );
   wp_enqueue_style( 'rpanel-css' );

  }
 }
}

Tiếp theo, tôi đang cố gắng giới hạn một số tập lệnh vào trang tùy chọn chủ đề của mình, điều này không thể được thực hiện dựa trên $ pagenow vì url xuất hiện là admin.php? Page = themeoptions và tôi không muốn tập lệnh trên mỗi quản trị viên trang .php, chỉ trên trang cụ thể đó (trang tùy chọn chủ đề của tôi)

Bất cứ ai biết làm thế nào điều này có thể được thực hiện tốt nhất?

Và để trả lời câu hỏi của riêng tôi:

if( is_admin() && ( $_GET['page'] == 'themeoptions' ) ){
  wp_enqueue_script( 'my-script' );

 }


2

Tôi biết câu hỏi đã được trả lời. Tôi nghĩ rằng đây là một giải pháp đơn giản hơn.

<?php
add_action( 'admin_enqueue_scripts', 'load_admin_datapicker_script' );

function load_admin_datapicker_script() {

    $current_screen = get_current_screen();

    if ( $current_screen->post_type === 'events' )  {
        $ss_url = get_bloginfo('stylesheet_directory');
        wp_enqueue_script('jquery');
        wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
        wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
        wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
        wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
        wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
    }

}
?> 

1

Tôi đã tạo một phiên bản không sử dụng biến $ typenow:

function isPostEditPage($strCheckType="")
{
    //This function will test for a post type and return true if it is the edit page for this type
    //an empty value means checking for native (original, not custom) post type
    $strCheckType=$strCheckType==""?"post":$strCheckType;
    $blnReturn=false;
    if(is_Admin())  
    {
        $strPage=basename($_SERVER['SCRIPT_FILENAME']);
        switch($strPage)
        {
            case "post.php":
                if(isset($_GET["post"]))
                {
                    $intPostID=$_GET["post"];
                    $strThisPostType=get_post_type($intPostID);
                    if($strCheckType==$strThisPostType)
                    {
                        $blnReturn=true;
                    }
                }
            break;
            case "post-new.php":
                $strThisPostType="post";
                if(isset($_GET["post_type"]))
                {
                    $strThisPostType=$_GET["post_type"];
                }
                if($strCheckType==$strThisPostType)
                {
                    $blnReturn=true;
                }

            break;
        }
    }
    return $blnReturn;
}

Toàn cầu sẽ không thay đổi, vì vậy chúng an toàn để sử dụng. Hơn nữa, có các móc dành riêng cho các trang đó, vì vậy bạn không cần chức năng đó và nỗ lực đó. Cuối cùng nhưng không kém phần quan trọng: Bạn đang kiểm tra các chuỗi không nghiêm ngặt và cũng không theo kiểu yoda, do đó chúng có thể thất bại. Cũng chỉ dựa vào $_GETthể thất bại. Dù sao: Chào mừng bạn đến với WPSE.
kaiser

1

Thế còn:

add_action( 'admin_init', 'scripts_admin' );

function scripts_admin($hook){

    global $typenow;
    if (empty($typenow) && !empty($_GET['post'])) {
         $post = get_post($_GET['post']);
             $typenow = $post->post_type;
     }
     if( 'post.php' != $hook && 'CUSTOMPOSTTYPE' != $typenow)
        return;

        wp_enqueue_script( 'google-api','http://maps.googleapis.com/maps/api/js?key=AIzaSyCD5TwT3vXLfYEv9WD-kOcEg7YQLcncsls&sensor=true', array( 'jquery' ) );


}

0

Điều này

$ typenow không có giá trị trong admin_init

không hoàn toàn chính xác Nó có một giá trị được đặt trên admin_init trong hầu hết các màn hình loại bài đăng như Thêm mới, danh sách phân loại, chỉnh sửa phân loại và danh sách mục nhập, nhưng nó không có trong màn hình "Chỉnh sửa YourPostType".

Ngoài ra, như những người khác đã chỉ ra, móc chính xác để sử dụng để thêm biểu định kiểu và tập lệnh vào WP Admin là admin_enqueue_scripts. Nếu bạn sử dụng hook này, bạn không cần phải kiểm tra is_admin()vì nó chỉ được kích hoạt trong WP Admin và bạn có được tham số như màn hình hiện tại. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

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.