サポート » プラグイン » プラグインの中で独自に定義した関数をadd_shortcodeで読み込む方法を教えてください

  • 解決済 echizenya

    (@echizenya)


    いつもお世話になっております。
    下記の質問についてご存知の方がいらっしゃいましたらご教示を願います。

    【質問の主旨】
    プラグインの中で定義したPHPの独自関数をショートコード API(add_shortcode)で読み込むためにはどうすれば良いでしょうか?

    【質問の補足】

    1.
    GitHubで、[paypalbutton]というショートコードを貼り付けるとpaypal_scripts()という独自関数が実行されるようにしています。そのpaypal_scripts()は、同じファイルの24行目から27行目で定義しています。

    2.
    このプラグインは[paypaldiv]と[paypalbutton]の2つのショートコードを記事投稿画面に貼ることによって、PayPalのExpressCheckoutのボタンが挿入できることを意図して作成しています。完成するとこの画像のような感じで表示がされます。

    以上、よろしくお願い申し上げます。

    ヘルプの必要なページ: [リンクを見るにはログイン]

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • 下記ページにコード例と説明が載っていますが、これだと役に立ちませんか?
    http://wpdocs.osdn.jp/ショートコード_API

    追記: add_shortcode() の第2パラメータで呼び出す関数が文字列を返すと、それが Web ブラウザーに表示されます。何も返さなければ、何も表示されません。

    • この返信は5年、 11ヶ月前にgblsmが編集しました。
    トピック投稿者 echizenya

    (@echizenya)

    @gblsm さん
    コメントありがとうございます。
    またショートコードAPIのご紹介ありがとうございます。
    ただドキュメントで紹介されている独自関数の例は、関数の返り値が”return”を使った文字列となっています。

    function paypalbutton_func(){
      paypal_scripts();
    }
    add_shortcode( 'paypalbutton', 'paypalbutton_func' );

    一方で自分が質問しているpaypalbutton_func()関数は、
    関数の実行結果としてpaypal_scripts()の実行結果を用いています。

    やはりショートコードAPI(add_shortcode)で使われる関数は、
    関数の返り値が”return”を使った文字列以外は受け付けられないのでしょうか?

    たびたびのお手数をおかけして恐れ入ります。
    もしご存知でしたらご教示をお願い申し上げます。

    こんにちは

    何が問題なのか理解できないのですが・・・

    paypal_scripts();はJavaScriptをenqueueしているだけですよね?
    enqueueされればそれで良いので、別になにもreturnしたり表示する必要はないと思いますが・・・

    それとも、質問の趣旨はショートコード中でenqueueしたもののscriptタグが生成されない、ということでしょうか?
    しかし、wp_enqueue_scriptsアクションフックで
    paypal_scripts()が呼び出されているので、すでにenqueueされているように見えます。
    ショートコードで再度enqueueする意味が何かあるのでしょうか?

    やりたいことを一言でまとめてしまうと

    下記ページに掲載されているコード(ボタン表示とクリック時の動作)をWordPress のショートコードを使って配置したい

    Express Checkout – Add the PayPal Button
    https://developer.paypal.com/docs/integration/direct/express-checkout/integration-jsv4/add-paypal-button/

    ですか?

    トピック投稿者 echizenya

    (@echizenya)

    @munyagu さん。
    いつもアドバイスありがとうございます。

    それとも、質問の趣旨はショートコード中でenqueueしたもののscriptタグが生成されない、ということでしょうか?

    はい。私の個人的な感想として、munyaguさんがおっしゃるような感じがするという主旨です。

    ショートコードで再度enqueueする意味が何かあるのでしょうか?

    PayPal ExpressCheckoutのボタンを表示させるためには、

    <div id="paypal-button-container"></div>

    の直後に、

    <script>
        paypal.Button.render({ 
    	...
    	});
    </script>

    のスクリプトタグを配置する必要があるからです。
    こちらのコードはfunctions.phpもプラグインも使わず、
    直接、content.phpにdivタグとscriptタグを貼り付けたものです。
    PayPal ExpressCheckoutの仕様上、このようなコードの配置をしなければPayPalボタンが表示されないため、ショートコードで再度’/js/expresscheckout.js’を表示させるような書き方をしています。

    • この返信は5年、 11ヶ月前にechizenyaが編集しました。
    トピック投稿者 echizenya

    (@echizenya)

    @gblsm さん。
    たびたびのコメントありがとうございます。

    やりたいことを一言でまとめてしまうと

    はい。おっしゃる通りです。gblsmさんが示していただいた、
    Add the script to your clientのうち以下の3つの要件が揃えば、PayPalのボタンが表示されることになります

    1. headタグ内にscriptタグの表示
    <script src="https://www.paypalobjects.com/api/checkout.js"></script>

    2. bodyタグ内にdivタグの表示
    <div id="paypal-button"></div>

    3.bodyタグ内にdivタグ内にscriptタグの表示

    <script>
        paypal.Button.render({ 
    	...
    	});
    </script>

    なお、こちらのコードは上記の3つの要件を揃えたコードです。関数もプラグインも使わず、すべてのコードを直接コピペしています。

    まだよくわからないのですが、
    [paypalbutton]というショートコードの関数で、divタグのあとに出力しないといけないとされているscriptタグのテキストをreturnすれば良いと思うのですが、そういうことではないんですよね?
    もっと言えば、ショートコードを2つに分ける意図もよくわかりません。
    続けて出力されればいいなら、1つのショートコードでいいと思いますが・・・

    また、「PayPal ExpressCheckoutの仕様上」とかかれている、
    <div id="paypal-button"></div>の直後にscriptタグが配置されないといけないというのは、本当にそうでしょうか?
    divタグがdocumentに定義されたあとにそのscriptが実行されればよいのではないかと思います。
    外部スクリプトファイルの状態でもdocument.readyなどでdocument読み込み後に実行すれば良いと思います。
    もちろん、直後に記述したほうが、ボタンは素早く現れると思いますが。

    @munyagu さんのコメントが的を得ていると思いましたので、これ以上のコメントは差し控えます。

    トピック投稿者 echizenya

    (@echizenya)

    @munyagu さん。
    たびたびのコメントありがとうございます。
    再度いただいたコメントについて、下記の4点を申し上げます。

    1.

    divタグのあとに出力しないといけないとされているscriptタグのテキストをreturnすれば良いと思うのですが、そういうことではないんですよね?

    本来であればdivタグのあとにそのままscriptタグのテキスト出力したいと考えています。
    以下のような感じにして[paypal]という1つのショートコードを記事投稿画面に貼って、
    記事でPayPalボタンが表示されることが、もっとも自分がやりたいことです。

    // [paypal]
    function paypal_func(){
      $paypaldiv = '<div id="paypal-button-container"></div>';
      return $paypaldiv;
      paypal_scripts();
    }
    add_shortcode( 'paypal', 'paypal_func' );

    2.

    もっと言えば、ショートコードを2つに分ける意図もよくわかりません。

    わざわざショートコードを2つに分ける意図は、paypal_scripts()関数が、
    自分の意図通りに反映されないため、あえて[paypaldiv]と[paypalbutton]に分けています。
    とりあえず2つに分けることによって、なぜ[paypalbutton]が意図通りに反映されないか確認するつもりでした。

    3.

    直後にscriptタグが配置されないといけないというのは、本当にそうでしょうか?

    恐れ入ります。この件につきましては私の認識違いでした。divタグとscriptタグの順番を入れ替え、無関係なタグを記述しGitHubにブランチを作って確認したところ、PayPalボタンは表示されました。

    <script>
    paypal.Button.render({
    ...
    });
    </script>
    <p>hoge</p>
    <div id="paypal-button-container"></div>

    4.

    3について考察すると、そもそも

    
    // [paypalbutton]
    function paypalbutton_func(){
      paypal_scripts();
    }
    add_shortcode( 'paypalbutton', 'paypalbutton_func' );
    

    というコードは先だってご指摘いただいたように不要ということになります。
    ただし、

    
    function paypal_scripts() {
    	wp_enqueue_script( 'paypal_scripts', plugins_url('/js/expresscheckout.js'));
    }
    add_action( 'wp_enqueue_scripts', 'paypal_scripts' );
    

    というコードは読み込まれず、記事投稿画面に[paypaldiv]のショートコードを貼っても
    なぜPayPalのボタンが表示されないのか?という疑問が残ってしまいます。

    たびたびの質問で恐れ入りますが、お手すきの時にでもご確認をいただければ幸いです。

    • この返信は5年、 11ヶ月前にechizenyaが編集しました。
    • この返信は5年、 11ヶ月前にechizenyaが編集しました。
    トピック投稿者 echizenya

    (@echizenya)

    @gblsm さん。
    コメントありがとうございます。

    これ以上のコメントは差し控えます。

    これからもどうぞよろしくお願いします。

    トピック投稿者 echizenya

    (@echizenya)

    @munyagu さん。
    お世話になっています。スレッドを作成していると、

    This post has been held for moderation by our automated system and will be manually reviewed by a moderator.

    という表示がされたため、類似の質問を下記のURLにて投稿させていただきました。

    https://ja.wordpress.org/support/topic/single-php%E3%81%A7script%E3%82%BF%E3%82%B0%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E3%81%9F%E3%82%81%E3%81%AE%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E4%BD%9C%E6%88%90%E3%81%AB%E3%81%A4/

    この課題については解決済みといたします。アドバイスありがとうございました。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • トピック「プラグインの中で独自に定義した関数をadd_shortcodeで読み込む方法を教えてください」には新たに返信することはできません。