TinyMCE プラグインに登録されている静的 .js ファイルを使用しています。新しいボタンをクリックすると、ショートコードの生成に使用するフォームが表示されたモーダル ウィンドウが開きます。問題は、フォーム フィールドの一部を PHP 関数から入力する必要があることです。私はこれに関する記事を何時間も見てきましたが、実行可能な解決策が見つかりませんでした. 現在、私のphp関数はショートコードであるため、通常の古い関数になるように適応させる必要があります. しかし、大きな課題は、.js ファイルがフォーム内の関数を取得できるように、これをどのように配置するかを考え出すことです。ここに基本的なものがあります。まず、.js ファイルのいくつかのチャンク:
(function(){
// creates the plugin
tinymce.create('tinymce.plugins.myshortcode', {
// creates control instances based on the control's id.
createControl : function(id, controlManager) {
if (id == 'myshortcode') {
// creates the button
var button = controlManager.createButton('myshortcode', {
title : 'My Shortcode', // title of the button
image : '../wp-content/plugins/my-shortcode/js/images/myshortcode.png', // path to the button's image
onclick : function() {
// triggers the thickbox
var width = jQuery(window).width(), H = jQuery(window).height(), W = ( 720 < width ) ? 720 : width;
W = W - 80;
H = H - 80;
tb_show( 'My Shortcode', '#TB_inline?width=' + W + '&height=' + H + '&inlineId=myshortcode-form' );
}
});
return button;
}
return null;
}
});
// registers the plugin.
tinymce.PluginManager.add('myshortcode', tinymce.plugins.myshortcode);
jQuery(function(){
var form = jQuery(' \
\
The HTML Web Form all goes in here.\
\
');
var table = form.find('table');
form.appendTo('body').hide();
form.find('#myshortcode-submit').click(function(){
var options = {
'att1' : '',
'att2' : '',
'att3' : '',
'att4' : '',
};
var shortcode = '[myshortcode';
for( var index in options) {
var value = table.find('#myshortcode-' + index).val();
if ( value !== options[index] && value != null )
shortcode += ' ' + index + '="' + value + '"';
}
shortcode += '] content here. [/myshortcode]';
tinyMCE.activeEditor.execCommand('mceInsertContent', 0, shortcode);
tb_remove();
});
});
})()
しかし、「HTML Web フォームがここに入ります」と書かれている場所には、PHP 関数に基づいて生成されたフィールドがいくつか必要です。これまでのところ、2 つのうちの 1 つしか書いていません。前述したように、現在はショートコードとして記述されているため、変更する必要があります (他の大きな質問があるため、これを行う最善の方法はわかりません)。しかし、ここにあります:
add_shortcode('rolescapsdropdown', 'sc_rolescapsdropdown');
function sc_rolescapsdropdown($attr) {
global $wp_roles;
$all_roles = $wp_roles->roles;
$editable_roles = apply_filters('editable_roles', $all_roles);
$user = new WP_User( 1 );
$capslist = $user->allcaps;
$dropdown = '<select multiple>';
foreach($editable_roles as $role=>$theroles){
$dropdown .= '<option value="'.$role.'">'.$role.'</option>';
}
foreach($capslist as $cap=>$caps){
if($cap !== 'administrator' && $cap !== 'level_0' && $cap !== 'level_1' && $cap !== 'level_2' && $cap !== 'level_3' && $cap !== 'level_4' && $cap !== 'level_5' && $cap !== 'level_6' && $cap !== 'level_7' && $cap !== 'level_8' && $cap !== 'level_9' && $cap !== 'level_10'){
$dropdown .= '<option value="'.$cap.'">'.$cap.'</option>';
}
}
$dropdown .= '</select>';
return $dropdown;
}
ここで Ajax を学ぶ必要がないようにしたいと考えています。しかし、.js ファイルを .php ファイルにして、JavaScript を<script>
タグで囲むだけにしてみましたが、TinyMCE のボタンがすべて消えてしまい、どうやら .php ファイルを使用してプラグインを登録することはできません。
更新 1
私が持っている 1 つのアイデアは、Web フォームを php ファイルに移動して、TMCE プラグインを登録する .js ファイルを呼び出すだけにすることですが、それが機能するかどうかも、. js ファイルを使用して、外部 php ファイル内のフォームの存在を認識します。
更新 2
ScottA のヘルプに基づいて、これをどのように処理しようとしているかを次に示します。
これを次の形式の静的 .js ファイルに追加しました。
$.get( "ajax/test.php", function( data ) {
var options = data.options;
for(row in options) {
$("#option-list").append("<option value=" + options[row].value + ">" + options[row].name + "</option>");
// debug for unexpected results
console.log(data.options);
}
}, "json" );
この test.php ファイルを「ajax」というサブディレクトリに作成しました。
function rolescapsdropdown() {
global $wp_roles;
$all_roles = $wp_roles->roles;
$editable_roles = apply_filters('editable_roles', $all_roles);
$user = new WP_User( 1 );
$capslist = $user->allcaps;
$all_options = $editable_roles . $capslist;
$all_options[]['value'] = $value;
$all_options[]['name'] = $name;
echo json_encode( array('options' => $all_options) );
}
そして、この HTML を静的 .js ファイルのフォームに追加しました。
<select id="option-list"></select>
私が得ているのは、空のモーダルウィンドウです。関数を含めても、HTML はまったく表示されません$.get
。
アップデート 3
まだ空白のモーダル ウィンドウが表示されます。それをショートコードに変換して、出力内容を確認しました。これ...
add_shortcode('rolesdropdown', 'sc_rolesdropdown');
function sc_rolesdropdown() {
global $wp_roles;
$all_roles = $wp_roles->roles;
$editable_roles = apply_filters('editable_roles', $all_roles);
$user = new WP_User( 1 );
$capslist = $user->allcaps;
foreach ($editable_roles as $role=>$theroles){
$all_options = $role;
}
foreach ($capslist as $cap=>$caps){
$all_options .= $cap;
}
echo json_encode( array('options' => $all_options) );
}
これをページに出力します:
{"オプション":"trollswitch_themesedit_themesactivate_pluginsedit_pluginsedit_usersedit_filesmanage_optionsmoderate_commentsmanage_categoriesmanage_linksupload_filesimportunfiltered_htmledit_postsedit_others_postsedit_published_postspublish_postsedit_pagesreadlevel_10level_9level_8level_7level_6level_5level_4level_3level_2level_1level_0edit_others_pagesedit_published_pagespublish_pagesdelete_pagesdelete_others_pagesdelete_published_pagesdelete_postsdelete_others_postsdelete_published_postsdelete_private_postsedit_private_postsread_private_postsdelete_private_pagesedit_private_pagesread_private_pagesdelete_userscreate_usersunfiltered_uploadedit_dashboardupdate_pluginsdelete_pluginsinstall_pluginsupdate_themesinstall_themesupdate_corelist_usersremove_usersadd_userspromote_usersedit_theme_optionsdelete_themesexportbe_trollexec_phpedit_others_phpadministrator"}}}
しかし、バックエンドのモーダル ウィンドウでは、$.get
その関数を含むファイルを呼び出しているときにウィンドウが空白になります。