it-swarm-vi.tech

Đ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ể?

Vì vậy, tôi tiếp tục gặp vấn đề này và tôi chỉ tìm kiế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 đã 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 để 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 ... Tôi ví dụ như đ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 hiện hành 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");
    }
   }
?> 
16
NetConstructor.com

Đầu tiên, tôi giả sử bạn đang sử dụng wp_enqueue_script() để tải tập lệnh của bạn , 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_init với chức năng load_my_script() để kiểm tra $pagenow toàn cầu để tìm trận đấu với trang quản trị edit.php và 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ề tại đâ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ì) $typenow không có giá trị trong admin_init vì vậy bạn sẽ cần lấy post_type bằ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 đã thấy 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') {

P.S. Đối với các câu hỏi khác của bạn, 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 cho 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à của tất cả những người khác đặt câu hỏi trên 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 làm cho Câu trả lời của WordPress trở nên to lớn tài nguyê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 sẽ thử điều này 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'));
    }
  }
}
14
MikeSchinkel

Theo Justin Tadlock, bạn nên nối vào admin_enqueue_scripts trái ngược với wp_enqueue_scripts cho các plugin hoặc tập lệnh chỉ dành cho quản trị viên:

http://justintadlock.com/archives/2011/07/12/how-to-load-javascript-in-the-wordpress-admin

add_action('admin_enqueue_scripts','load_admin_datapicker_script');
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' ] có thể thay đổi máy chủ thành máy chủ (bất kỳ ai cũng biết khả năng $_SERVER[ 'SCRIPT_FILENAME' ] không khả dụng trên máy chủ là bao nhiêu?)

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 tinh chỉnh 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' );

 }
3
Ashley G

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


}
1
chifliiiii

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

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
grappler

Đ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 màn hình most post 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 Quản trị viên 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 nhận được tham số trên màn hình hiện tại. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

0
Elliot