it-swarm.asia

تحميل البرامج النصية الخارجية في المسؤول ولكن فقط لنوع وظيفة محددة؟

لذلك أواصل مواجهة هذه المشكلة وأبحث عن أفضل وأبسط حل لحل هذه المشكلة.

لقد جئت للاستفادة من أنواع المنشورات المخصصة في العديد من المشروعات المختلفة وقمت بتوسيعها باستخدام عمليات استقلاب مخصصة والتي قمت بتوسيعها بعد ذلك عن طريق إضافة برامج نصية مخصصة مثل محددات تقويم أحداث jQuery ... كل هذا يعمل بشكل رائع باستثناء مشكلة رئيسية واحدة ... لا أريد تحميل هذه البرامج النصية المخصصة jQuery على كل صفحة في المشرف.

أنا أبحث فقط أساسًا عن طريقة لتحميل حقول المسج المخصصة هذه عندما أكون في صفحة "تحرير النشر" لنوع نشر محدد.

ما هو الحل الأفضل هنا؟


تحديث 1

بادئ ذي بدء ، شكرا جزيلا لك.

لقد صدمت بالفعل لأن مطوري البرنامج المساعد لا يتأكدون من أشياء مثل هذا لأنني عندما اكتشفت أن هذا أحد الأسباب الرئيسية لوجود مشاكل في المكونات الإضافية المختلفة.

أواجه بعض المشكلات الأخرى مع هذا. فمثلا...

لقد قمت بتعديل البرنامج النصي للاتصال ببيان if مثل هذا:

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

كما ترون ، أحاول إعداد الأشياء بحيث لا يتم استدعاء البرامج النصية الخاصة بي إلا عند إضافة منشور أو تحريره ضمن نوع منشور "الأحداث".

لا أريد أن يتم تحميل البرنامج النصي على أي صفحة أخرى وأيضًا لا أريد تشغيله على قائمة الصفحة ضمن نوع منشور "الأحداث" ، لذلك أعتقد أن عبارة if صحيحة.

ومع ذلك ، يبدو أن المشكلة هي أن البرنامج النصي يتم تحميله فقط عندما أقوم بإنشاء منشور جديد ضمن نوع المنشور هذا ، لكن لا يبدو أنه يعمل عندما أقوم بتحرير منشور موجود.

هل يمكنك اختبار هذا الأمر وربما أخبرني بما يمكن أن أفعله بشكل خاطئ؟

إليك الرمز الدقيق الذي أستخدمه ... ربما هناك طريقة أفضل أو بسيطة للقيام بذلك؟

<?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");
  }
}

أيضًا ... إذا أردت إضافة ثلاثة أنواع منشورات وتحميل نصوص JS مختلفة لكل أنواع المنشورات ، فهل يمكنني تكرار الكود أعلاه ثلاث مرات منفصلة أم أن هذه ليست طريقة جيدة للقيام بذلك؟ على سبيل المثال ... هل سيكون من الأفضل الاتصال فقط: global $ pagenow، $ typenow؛ في الجزء العلوي من ملف الوظائف أو هل يهم أو يعقد الأمور عندما أكررها أكثر من مرة؟

فيما يتعلق بمشكلة مختلفة تتعلق بالنفس ... على سبيل المثال ، أستخدم المكوّن الإضافي "أشكال الجاذبية" لكنني لاحظت أن البرامج النصية الخاصة بهم تعمل على كل صفحة على المسؤول والتي تسبب مشاكل مع الإضافات الأخرى. كيف يمكنني تعديل البرنامج النصي الخاص بهم لضمان تحميل البرامج النصية فقط عندما أحتاج إليها.


تحديث 2

لقد قمت بتعديل ملف function.php الخاص بي مع الكود الذي يوفره Mike (أدناه) ، لكن يبدو أن جافا سكريبت المطبق لا يزال يتم تضمينه عند إنشاء منشور جديد أو صفحة جديدة. هذا يعني أنه عند محاولة إنشاء منشور جديد أو صفحة جديدة إما عن طريق إنشاء منشور/صفحة وورد افتراضي جديد أو عند إنشاء منشور/صفحة جديد يستند إلى أحد أنواع منشوراتك المخصصة. الرمز الذي اقترحه Mike IS يعمل على جميع صفحات المشرف الأخرى ويعمل عند قيامك "بتحرير" منشور/صفحة حالية أو نوع منشور مخصص. أي تعديلات مقترحة لجعل هذا العمل صحيح؟

هنا هو قانون بلدي الحالي:

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

أولاً ، أفترض أنك تستخدم wp_enqueue_script() لتحميل البرامج النصية الخاصة بك ، أليس كذلك؟

إذا قلت ذلك ، إذا فهمت سؤالك بعد ذلك ما تحتاجه هو شيء مثل التالي . سيتعين عليك تعديله للحصول على تفاصيلك ، بالطبع ، ولكنه يمنحك الإطار العام.

نحن نربط admin_init بوظيفة load_my_script() لاختبار $pagenow الشامل لمطابقة صفحة المشرف edit.php والرمز $typenow العام لمعرفة ما إذا كان نوع المنشور هو الذي تريده.

الباقي مجرد تفاصيل يمكنك أن تقرأ عنها هنا إذا كنت بحاجة إلى معرفة المزيد:

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

تحديث

أنا الرد على التحديث الخاص بك. لسوء الحظ (لأي سبب من الأسباب) لا تحتوي $typenow على قيمة خلال admin_init لذلك ستحتاج إلى الحصول على post_type عن طريق تحميل المنشور استنادًا إلى معلمة URL 'post' كما ترى في المثال التالي (لقد قمت بنسخ الرابط) السطر أعلاه والخط أدناه من المثال الخاص بك حتى تتمكن من معرفة مكان وضعه):

<?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') {

ملاحظة بالنسبة لأسئلتك الأخرى ، يرجى نشرها كسؤال جديد على الموقع بالنسبة لي أو للآخرين للإجابة. نظرًا لأننا نعمل بجد لمساعدتك ، يرجى توخي الحذر الشديد لمنح عنوانك أفضل لقب ممكن ، كما يرجى كتابة أسئلتك بشكل واضح وموجز قدر الإمكان مع التنسيق الجيد واللغة الإنجليزية المناسبة. إذا كنت ستفعل ذلك ، فسوف يساعدك في نفس المشكلات في التعرف على سؤالك على أنه يشبه ما يحتاجون إليه ، وسوف يسهل علينا من نجيب على أسئلتك.

أسألك هذا (وجميع الأشخاص الآخرين الذين يطرحون أسئلة على إجابات WordPress) كمقابل في مقابل قضاء الوقت في الجهد للإجابة على أسئلتك لأنني والمشرفون الآخرون يريدون جعل WordPress Answers مصدرًا هائلاً لـ المجتمع بدلاً من منتدى قذر آخر يصعب قراءته ويصعب العثور على إجابات مثل العديد من المواقع الأخرى على الويب.

تحديث # 2

اعتقدت أنك قد تكون لديك مشكلات الأسبقية لمشغل في بيان if الخاص بك ولكن عندما اختبرت قبل ذلك لم أواجهها. إذا كان الأمر يتصرف برأيك ، فمن المؤكد أنك تفعل ذلك ، جرب هذا بدلاً من ذلك (آسف ، ليس لدي وقت لاختباره الآن للتأكد من نجاحه):

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

لكل جاستن تادلوك ، يجب عليك ربط admin_enqueue_scripts بدلاً من wp_enqueue_scripts للمكونات الإضافية أو البرامج النصية للمشرف فقط:

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
Nathaniel Schweinberg

اعتقدت أنني سأضيف بعض الكود هنا الذي حل مشكلة متعلقة بالألغام. في حالتي ، أحاول الحصول على جافا سكريبت و css ليتم تحميلهما فقط على الصفحات والمنشورات و (تحرير وإنشاء) وليس في أي مكان آخر.

لقد وجدت حلاً عمليًا باستخدام basename( $_SERVER[ 'SCRIPT_FILENAME' ] ) لتحديد المكان الذي كنت فيه على الواجهة الخلفية. كنت قلقًا على الرغم من أن توفر $_SERVER[ 'SCRIPT_FILENAME' ] قد يختلف من خادم لآخر (أي شخص يعرف مدى احتمال ألا يكون $_SERVER[ 'SCRIPT_FILENAME' ] متاحًا على خادم؟)

ثم صادفت هذا السؤال وأجب MikeSchinkel. مع القليل من التعديل الذي أدليت به بالنسبة لي باستثناء شيء واحد. يبدو أنه لأي سبب من الأسباب عندما يتم إنشاء منشور جديد عبر "إضافة جديد" ، لا يعمل.

من خلال التعديلات التالية ، بدأت العمل وأشاركها هنا على أمل مساعدة الآخرين وتحسينه.

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

  }
 }
}

بعد ذلك أحاول قصر بعض البرامج النصية على صفحة خيارات السمة الخاصة بي ، والتي لا يمكن إجراؤها بناءً على $ pagenow لأن عنوان url الذي يظهر هو admin.php؟ page = themeoptions ولا أريد البرامج النصية على كل مشرف صفحة .php ، فقط على تلك الصفحة المحددة (صفحة خيارات السمة الخاصة بي)

أحد يعرف كيف يمكن القيام بذلك أفضل؟

وللإجابة على سؤالي الخاص:

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

 }
3
Ashley G

ماذا عن:

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

لقد قمت بإنشاء إصدار لا يستخدم المتغير 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

أعلم أن السؤال قد تمت الإجابة عليه. أعتقد أن هذا حل أبسط.

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

هذه

لا يحتوي typenow $ على قيمة أثناء admin_init

ليس صحيحا تماما. له قيمة محددة على admin_init في معظم شاشات نوع مثل إضافة جديد ، وقائمة التصنيف ، وتحرير التصنيف وقائمة الإدخال ، ولكن ليس لديها واحدة في شاشة "تحرير YourPostType".

أيضًا ، كما أشار آخرون ، فإن الخطاف الصحيح الذي يجب استخدامه لإضافة أوراق أنماط وبرامج نصية إلى WP المسؤول هو admin_enqueue_scripts. إذا كنت تستخدم هذا الخطاف ، فلست بحاجة إلى التحقق من is_admin() لأنه يتم تشغيله فقط في WP المسؤول وستحصل على الشاشة الحالية كمعلمة. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

0
Elliot