サードパーティJSのスクリプトタグに属性を追加する


20

DropboxのChooser APIドロップを作成中のプラグインに統合しようとしたときに、これに遭遇しました。

APIドキュメントscriptでは、ファイルの先頭に次のタグを配置するよう指示されています。

<script type="text/javascript" src="https://www.dropbox.com/static/api/1/dropins.js" id="dropboxjs" data-app-key="MY_APP_KEY"></script>

すべてうまくいき、管理セクションで呼び出されるページに直接貼り付けると実際に機能します。しかし、wp_register_script()、wp_enqueue_script()、wp_localize_script()のバリエーションを使用して、必要なidとdata-app-keyを渡したいと思います。

私はこれのいくつかの異なるバリエーションを試しました:

add_action('admin_enqueue_scripts', 'add_dropbox_stuff');
function add_dropbox_js() {
    wp_register_script('dropbox.js','https://www.dropbox.com/static/api/1/dropins.js');
    wp_enqueue_script('dropbox.js');
    wp_localize_script('dropbox.js','dropboxdata',array('id'=>"dropboxjs",'data-app-key'=>"MY_APP_KEY"));
}

そして:

add_action('admin_enqueue_scripts', 'add_dropbox_stuff');
function add_dropbox_stuff() {
        wp_register_script('dropbox.js','https://www.dropbox.com/static/api/1/dropins.js');
        wp_enqueue_script('dropbox.js');
        wp_localize_script('dropbox.js','dropboxdata',array(array('id'=>"dropboxjs"),array('data-app-key'=>"MY_APP_KEY")));
    }

MY_APP_KEYは、コード内の適切なアプリケーションキーに置き換えられます。任意の方向に感謝します。ありがとう。

編集:また、いくつかのjqueryでそれをやろうとしましたが、役に立ちませんでした。ドキュメントのロード時およびドキュメントの準備時に試してみました。{"エラー": "無効なapp_key"}が返されます。

$('script[src="https://www.dropbox.com/static/api/1/dropins.js?ver=3.6"]').attr('id','dropboxjs').attr('data-multiselect','true').attr('data-app-key','MY_APP_KEY');

2
何をwp_localize_scriptやっていることはページのHTML出力にJSONエンコードオブジェクトを印刷します。このオブジェクトはスクリプトによって認識されるため、使用できます。必要なのは、スクリプトタグにいくつかの属性を追加wp_localize_scriptすることです。
gmazzap

2
GMは正しいwp_localize_scriptので、スクリプトの属性は作成しません。しかし、アプリキーを直接dropbox.jsに渡すことは可能ですか?ただの推測ですが、試してみましたarray('appKey'=>"MY_APP_KEY")か?これは、属性からキーをつかむのコードですif(!Dropbox.appKey){Dropbox.appKey=(e=document.getElementById("dropboxjs"))!=null?e.getAttribute("data-app-key"):void 0}
epilektric

ちょっと@epilektricそれを答えに入れていただけますか?私はそれを実装する方法を完全には守っていません。
アンドリューバーテル

@epilektricを使用wp_localize_scriptして、スクリプトに属性を渡すことができます。これがうまくいくかどうかは本当にわかりませんが、それはワープレス関連の問題ではありません。
gmazzap

@AndrewBartelどちらがどうなのかよく分からない。たぶんこれが役立つでしょう。pippinsplugins.com/use-wp_localize_script-it-is-awesome
epilektric

回答:


18

script_loader_srcフィルタフックの使用を試みることができます。例:

add_filter('script_loader_src','add_id_to_script',10,2);
function add_id_to_script($src, $handle){
    if ($handle != 'dropbox.js') 
            return $src;
    return $src."' id='dropboxjs' data-app-key='MY_APP_KEY";
}

更新

私はsrcがesc_urlによってエスケープされていることを自分で理解したので、もう少し探しclean_urlて、IDとアプリのキーデータで値を返すために使用できるフィルターを見つけました。

add_filter('clean_url','unclean_url',10,3);
function unclean_url( $good_protocol_url, $original_url, $_context){
    if (false !== strpos($original_url, 'data-app-key')){
      remove_filter('clean_url','unclean_url',10,3);
      $url_parts = parse_url($good_protocol_url);
      return $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . "' id='dropboxjs' data-app-key='MY_APP_KEY";
    }
    return $good_protocol_url;
}

機能しません。印刷される前に、「script_loader_src」の結果はエスケープされるため、引用符は取り除かれ、出力内容は個別の属性としてではなく「src」属性の一部として認識されます。このコードは、HTMLマークアップで何か入れます<script type='text/javascript' src='https://www.dropbox.com/static/api/1/dropins.js?ver=3.6&#039;id=&#039;dropboxjs&#039;data-app-key=&#039;MY_APP_KEY'></script>
gmazzap

答えを更新しました。
Bainternet

3
編集後にコードをテストしましたが、動作します。これで何か教えてくれてありがとう。
gmazzap

1
OPはあなたよりも幸せになると思います。;)
gmazzap

1
あなたの助けを@Bainternetに感謝し、あなたの答えを使って機能させました。
アンドリューバーテル

14

WP 4.1.0以降、これを簡単に達成するための新しいフィルターフックが利用可能です。

script_loader_tag

次のように使用します。

add_filter( 'script_loader_tag', 'add_id_to_script', 10, 3 );

function add_id_to_script( $tag, $handle, $source ) {
    if ( 'dropbox.js' === $handle ) {
        $tag = '<script type="text/javascript" src="' . $source . '" id="dropboxjs" data-app-key="MY_APP_KEY"></script>';
    }

    return $tag;
}

これは、JSキャッシングが行われる前に実行されますか?
ジョアンナミカ

3

OK、(私にとって)with wp_enqueque_scriptsは、スクリプトタグ属性としてidとアプリキーを印刷することができないようです。

私はよくWP_Dependencies知っているクラスではないので、私は90%と確信していますが、コードを見ると私には不可能だと思われます。

しかし、100%を使用することwp_localize_scriptあなたのスコープにとって有用でないと確信しています

上記の私のコメントで言ったように:

wp_localize_scriptは、ページのhtml出力にjsonエンコードされたオブジェクトを出力します。このオブジェクトはスクリプトによって認識されるため、使用できます。

私がコメントで言っていないのは、実際に構文を見て決定する任意の名前としてのjsonエンコードされたオブジェクトです:

wp_localize_script( $handle, $object_name, $l10n );

指定されたオブジェクトは、グローバルスコープ内にあり、ページのhtmlに出力されるため、スクリプトで使用$object_name できます。

しかし、それ$object_nameあなたが決める名前ですので、それはすべてでありえます

自問してみてください:

リモートDropboxサーバーのスクリプトは、どのように呼ばれているのかわからない変数をどのように利用できますか?

だから、ありませんまったく理由でスクリプトにID、および/またはアプリのキーを渡すためにはwp_localize_scriptあなたがちょうど持っているスクリプトタグは属性としてそれらを印刷するなどのDropbox APIドキュメントに言われています。

私はjs開発者ではありませんが、Dropboxスクリプトの機能は次のとおりです。

  1. <script>ページ内のすべてのhtml要素を取得します
  2. 'id' == 'dropboxjs'を持つものを探してそれらを循環します
  3. そのスクリプトが見つかった場合、そのスクリプトの「data-app-key」を見て
  4. そのアプリキー(存在する場合)が有効なものであるかどうかを確認し、有効な場合は承認します

私はこれを確かに知らないこと注意してください、ただ推測しています。

このように、Dropboxサーバーから読み込まれたスクリプトは、アプリキーを簡単に実装でき、アプリキーをチェックできます。

最初の文で、を使用してスクリプトのidとアプリキーを印刷することはできないと言ったのでwp_enqueque_scripts、ストーリーの教訓は、別の方法でマークアップに印刷する必要があるということです。

臭いがしすぎない方法(代替手段がない場合)は、wp_print_scriptsフックを使用してスクリプトタグを出力することです。

add_action('wp_print_scripts', 'do_dropbox_stuff');

function do_dropbox_stuff() {

  if ( ! is_admin() ) return; // only for admin area

  $app_key = 'MY_APP_KEY';

  // why do not create an option for it?
  // $app_key = get_option('dropbox_app_key');

  if ( empty($app_key) ) return;

  echo '<script type="text/javascript" src="https://www.dropbox.com/static/api/1/dropins.js" id="dropboxjs" data-app-key="' . esc_attr($app_key) . '"></script>';

}

GMのおかげで、これを使用して動作するようになりました。エンキューフックを使用する代替ソリューションがあるかどうかを確認したいのですが、回答に寄せられたすべての考えに感謝します。
アンドリューバーテル

@AndrewBartelあなたのケースでwp_enqueque_scriptsを使用する方法はないと思いますが、見つけた場合はお知らせください!:)
gmazzap

エコーを実行することにより、さらに1つのHTTP要求を直接作成しているため、ソリューションでサーバーの負荷を増やすことができます。ソリューションは優れていますが、最適化されていません。
ファイサルシェイク

@FaisalShaikhは説明する気?echo私が知る限り、このステートメントはHTTPリクエストを行いません。WordPresswp_enqueue_scriptもエコーを行います(core.trac.wordpress.org/browser/tags/4.9/src/wp-includes/…を参照してください)。スクリプトを他のスクリプトと組み合わせることによるリクエストの数:1)スクリプトはこの場合サードパーティのサーバーに存在します それで私は何かが恋しいですか?
gmazzap

@gmazzapあなたは正しい。実際、これを行う別の方法があります。この第3部のjsをサーバーに保存できますが、スクリプトを組み合わせるとサーバーの負荷が増加するとは感じません。
ファイサルシェイク

1

上記のBainternetの回答から。このコードはうまくいきました。

function pmdi_dropbox( $good_protocol_url, $original_url, $_context){
    if ( FALSE === strpos($original_url, 'dropbox') or FALSE === strpos($original_url, '.js')) {
        return $url;
    } else {
        remove_filter('clean_url','pmdi_dropbox',10,3);
        $url_parts = parse_url($good_protocol_url);
        return $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . "' id='dropboxjs' data-app-key='APIKEY";
    }
}

編集:Bainternetコードとの唯一の違いは、スクリプトURLがドロップボックスであり、.jsファイルであるかどうかを確認する条件を追加したことです。

他のすべてのURLを無視し、ドロップボックスURLを書き換えています。


2
変更内容と変更した理由(または変更する必要があった理由)について説明を追加してください。
tfrommen 14

私はこれが古い応答であることを知っていますが、上記のコードでは、単に$ urlの代わりにIFステートメント内で$ original_urlを返すつもりですか?
-leromt

1

dropbox.jsコード(v2)をチェックして、何が起こっているのか、これをどのように解決するのが最善かを確認しました。結局のところ、data-app-keyは変数Dropbox.appKeyを設定するためにのみ使用されます。次の行を追加して変数を設定できます。

Dropboxページhttps://www.dropbox.com/developers/dropins/chooser/jsで JavaScriptの例を使用します

<script>
Dropbox.appKey = "YOUR-APP-ID";
var button = Dropbox.createChooseButton(options);
document.getElementById("container").appendChild(button);
</script>

私のコードでは、Dropbox javascriptルーチンを参照するすべての場所にDropbox.appKeyを設定しています。これにより、追加のパラメーターなしでwp_enqueue_script()を使用できました。


0

eCardsプラグインでこれを行いましたが、本当に簡単です。

プラグインからの直接のコピー/貼り付けは次のとおりです。

$output .= '<!-- https://www.dropbox.com/developers/chooser -->';
$output .= '<script type="text/javascript" src="https://www.dropbox.com/static/api/1/dropbox.js" id="dropboxjs" data-app-key="' . get_option('ecard_dropbox_private') . '"></script>';
$output .= '<p><input type="dropbox-chooser" name="selected-file" style="visibility: hidden;" data-link-type="direct" /></p>';

APIキーがオプションを介して渡されることに注意してください。


$ outputはどのように使用されますか?エコー?wp_print_scripts()に追加しますか?
アンドリューバーテル

関数に応じて、返されるかエコーされます。
キプリアン

0

これを行う簡単な方法があります

 function load_attributes( $url ){
    if ( 'https://www.dropbox.com/static/api/1/dropins.js' === $url ){
        return "$url' id='dropboxjs' data-app-key='MY_APP_KEY";
    }

    return $url;
}

add_filter( 'clean_url', 'load_attributes', 11, 1 );

0

script_loader_tagの Wordpress構文:

apply_filters( 'script_loader_tag', string $tag, string $handle, string $src )

属性を追加するには、このように$ tagを変更できます。

add_filter('script_loader_tag', 'add_attributes_to_script', 10, 3); 
function add_attributes_to_script( $tag, $handle, $src ) {
    if ( 'dropbox.js' === $handle ) {
        $tag = '<script type="text/javascript" src="' . esc_url( $src ) . '" id="dropboxjs" data-app-key="MY_APP_KEY"></script>';
    } 
    return $tag;
}

これはURLを正しくエスケープします。


0

すべての投稿をありがとう、彼らは本当に助けた。独自のバージョンをロールして、構造を与え、読みやすく、更新しやすくしました。通常どおりエンキューを使用し、CSSファイルのスクリプトを使用して、末尾にfalseタグを付けて、先頭にロードするようにします。おそらくいくらか簡単にできますが。

add_filter('script_loader_tag', 'add_attributes_to_script', 10, 3); 
function add_attributes_to_script( $tag, $handle, $src ) {

    $scripts_to_load = array (

        (0) => Array
          (
            ('name') => 'bootstrap_min_css',
            ('type') => '<link rel="stylesheet" href="',            
            ('integrity') => 'sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB',
            ('close') => ' type="text/css" media="all">'
          ),

        (1) => Array
          (
            ('name') => 'popper_min_js',
            ('type') => '<script type="text/javascript" src="',         
            ('integrity') => 'sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49',
            ('close') => '></script>'
          ),

         (2) => Array
           (
            ('name') => 'bootstrap_min_js', 
            ('type') => '<script type="text/javascript" src="',
            ('integrity') => 'sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T',
            ('close') => '></script>'
           )
    );  

    $key = array_search($handle, array_column($scripts_to_load, 'name'));

    if ( FALSE !== $key){

        $tag = $scripts_to_load[$key]['type'] . esc_url($src) . '" integrity="' . $scripts_to_load[$key]['integrity'] .'" crossorigin="anonymous"' . $scripts_to_load[$key]['close'] . "\n";

    }
    return $tag;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.