単一の投稿のコンテンツの途中にテキスト(Google広告)を挿入する簡単なプラグインがあります。ユーザーが広告コードを変更し、どの段落の後に広告が表示されるかを変更できる設定ページを作成しようとしています。
私は一日中チュートリアルとコードを読んで過ごしました、そして私は素敵な設定ページを持っています、しかし私はそれを実際にデータを保存するために取得する方法を理解することができません。私は主にProfessional WordPress Plugin Developmentの例に従っています。
これは私が持っているものです:
<?php
// add plugin options
add_option( 'wpa_ad_insert_paragraph', '2' );
add_option( 'wpa_ad_insert_adcode', 'ad code goes here');
// update options
update_option( 'wpa_ad_insert_paragraph', $_POST['wpa_ad_insert_paragraph'] );
update_option( 'wpa_ad_insert_adcode', $_POST['wpa_ad_insert_adcode'] );
// Add a menu for our option page
add_action('admin_menu', 'wpa_ad_insert_add_page');
function wpa_ad_insert_add_page() {
add_options_page( 'Ad Insertion', 'Ad Insertion', 'manage_options', 'wpa_ad_insert', 'wpa_ad_insert_option_page' );
}
// Draw the option page
function wpa_ad_insert_option_page() {
?>
<div class="wrap">
<?php screen_icon(); ?>
<h2>Ad Insertion</h2>
<form action="options.php" method="post">
<?php settings_fields('wpa_ad_insert_options'); ?>
<?php do_settings_sections('wpa_ad_insert'); ?>
<input name="Submit" type="submit" value="Save Changes" />
</form>
</div>
<?php
}
// Register and define the settings
add_action('admin_init', 'wpa_ad_insert_admin_init');
function wpa_ad_insert_admin_init(){
register_setting(
'wpa_ad_insert_options',
'wpa_ad_insert_options',
'wpa_ad_insert_validate_options'
);
add_settings_section(
'wpa_ad_insert_main',
'Ad Insertion Settings',
'wpa_ad_insert_section_text',
'wpa_ad_insert'
);
add_settings_field(
'wpa_ad_insert_paragraph',
'Ad will appear after paragraph number:',
'wpa_ad_insert_paragraph_setting',
'wpa_ad_insert',
'wpa_ad_insert_main'
);
add_settings_field(
'wpa_ad_insert_adcode',
'Ad code:',
'wpa_ad_insert_adcode_setting',
'wpa_ad_insert',
'wpa_ad_insert_main'
);
}
function wpa_ad_insert_paragraph_setting() {
$options = get_option('wpa_ad_insert_paragraph');
$items = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20");
echo "<select id='wpa_ad_insert_paragraph' name='plugin_options[wpa_ad_insert_paragraph]'>";
foreach($items as $item) {
$selected = ($options['wpa_ad_insert_paragraph']==$item) ? 'selected="selected"' : '';
echo "<option value='$item' $selected>$item</option>";
}
echo "</select>";
}
function wpa_ad_insert_adcode_setting() {
$options = get_option('wpa_ad_insert_adcode');
echo "<textarea id='wpa_ad_insert_adcode' name='plugin_options[wpa_ad_insert_adcode]' rows='7' cols='50' type='textarea'>{$options['wpa_ad_insert_adcode']}</textarea>";
}
function wpa_insert_ad($content) {
$paragraphAfter = get_option('wpa_ad_insert_paragraph');
$ad = get_option('wpa_ad_insert_adcode');
if( is_single() && is_main_query() ) {
$content = explode("</p>", $content);
for ($i = 0; $i <count($content); $i++ ) {
if ($i == $paragraphAfter)
echo $content[$i] . "</p>";
}
}
return $content;
}
add_filter('the_content', 'wpa_insert_ad');
?>
このコードは設定ページを作成しますが、設定ページを保存しても何も起こりません(私の設定が保存されたことを示す黄色いバーが表示されますが、情報はデータベースに保存されません)。
私はここで何が足りないのですか?
Settins APIを使用している間、update_option
またはadd_option
関数を使用する必要がないのはそのためです。設定APIはそれを自分で処理します。
コードが機能していない理由はいくつかありました。
1。
add_settings_section(
'wpa_ad_insert_main',
'Ad Insertion Settings',
'wpa_ad_insert_section_text',
'wpa_ad_insert'
);
3番目のパラメータはコールバック関数です。なので、この関数は必要ないので、コールバックとして__return false
を追加するだけです。それでは、この関数のコードは次のようになります。
add_settings_section(
'wpa_ad_insert_main',
'Ad Insertion Settings',
'__return_false',
'wpa_ad_insert'
);
2。
register_setting(
'wpa_ad_insert_options',
'wpa_ad_insert_options',
'wpa_ad_insert_validate_options'
);
上記のコードを見てください。 2番目のパラメータはオプション名なので、データベースからオプションを取得するときにこのオプション名を使用する必要があるのはそのためです。そのオプション名を呼び出す代わりに、次の2つのオプション名を呼び出しました。
$options = get_option('wpa_ad_insert_paragraph');
$options = get_option('wpa_ad_insert_adcode');
register_setting
関数で別のオプション名を使用したため、そのオプションをデータベースに取得できませんでした。 get_option
関数に登録したオプション名でregister_setting
関数を呼び出す必要があります。そしてそれは次のようになります。
$options = get_option('wpa_ad_insert_options');
3.しかし、データはまだデータベースに保存されていませんね。なぜなら、あなたはフォーム入力とテキストエリアの名前としてplugin_options
を使ったからです。あなたはwordpress設定APIを使っているので、option_name
関数でregister_setting
として登録したのと同じ名前を使うべきです。
そのため、このコードを使用可能にするためにいくつか修正する必要があります。私はあなたのコードの数行を修正しました、そしてそれはうまくいきます。 register_setting
関数をこれに置き換えます。
register_setting(
'wpa_ad_insert_options',
'plugin_options',
'wpa_ad_insert_validate_options'
);
add_settings_section
関数をこれに置き換えます。
add_settings_section(
'wpa_ad_insert_main',
'Ad Insertion Settings',
'__return_false',
'wpa_ad_insert'
);
すべてのget_option
関数をこの関数に置き換えます。$ options = wpa_options( 'plugin_options');
そして最後に、この新しいコードを追加します。
function wpa_options() {
$default = array(
'wpa_ad_insert_paragraph' => 1,
'wpa_ad_insert_adcode' => ''
);
return get_option('plugin_options', $default);
}
まとめると、
// Add a menu for our option page
add_action('admin_menu', 'wpa_ad_insert_add_page');
function wpa_ad_insert_add_page() {
add_options_page( 'Ad Insertion', 'Ad Insertion', 'manage_options', 'wpa_ad_insert', 'wpa_ad_insert_option_page' );
}
// Draw the option page
function wpa_ad_insert_option_page() {
?>
<div class="wrap">
<?php screen_icon(); ?>
<h2>Ad Insertion</h2>
<form action="options.php" method="post">
<?php settings_fields('wpa_ad_insert_options'); ?>
<?php do_settings_sections('wpa_ad_insert'); ?>
<input name="Submit" type="submit" value="Save Changes" />
</form>
</div>
<?php
}
// Register and define the settings
add_action('admin_init', 'wpa_ad_insert_admin_init');
function wpa_ad_insert_admin_init(){
register_setting(
'wpa_ad_insert_options',
'plugin_options',
'wpa_ad_insert_validate_options'
);
add_settings_section(
'wpa_ad_insert_main',
'Ad Insertion Settings',
// 'wpa_ad_insert_section_text',
'__return_false',
'wpa_ad_insert'
);
add_settings_field(
'wpa_ad_insert_paragraph',
'Ad will appear after paragraph number:',
'wpa_ad_insert_paragraph_setting',
'wpa_ad_insert',
'wpa_ad_insert_main'
);
add_settings_field(
'wpa_ad_insert_adcode',
'Ad code:',
'wpa_ad_insert_adcode_setting',
'wpa_ad_insert',
'wpa_ad_insert_main'
);
}
register_setting(
'wpa_ad_insert_options',
'plugin_options',
'wpa_ad_insert_validate_options'
);
function wpa_ad_insert_paragraph_setting() {
$options = wpa_options('plugin_options');
$items = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20");
echo "<select id='wpa_ad_insert_paragraph' name='plugin_options[wpa_ad_insert_paragraph]'>";
foreach($items as $item) {
$selected = ($options['wpa_ad_insert_paragraph']==$item) ? 'selected="selected"' : '';
echo "<option value='$item' $selected>$item</option>";
}
echo "</select>";
}
function wpa_ad_insert_adcode_setting() {
$options = wpa_options('plugin_options');
echo "<textarea id='wpa_ad_insert_adcode' name='plugin_options[wpa_ad_insert_adcode]' rows='7' cols='50' type='textarea'>{$options['wpa_ad_insert_adcode']}</textarea>";
}
function wpa_insert_ad($content) {
$paragraphAfter = get_option('wpa_ad_insert_paragraph');
$ad = get_option('wpa_ad_insert_adcode');
if( is_single() && is_main_query() ) {
$content = explode("</p>", $content);
for ($i = 0; $i <count($content); $i++ ) {
if ($i == $paragraphAfter)
echo $content[$i] . "</p>";
}
}
return $content;
}
add_filter('the_content', 'wpa_insert_ad');
function wpa_options() {
$default = array(
'wpa_ad_insert_paragraph' => 1,
'wpa_ad_insert_adcode' => ''
);
return get_option('plugin_options', $default);
}
私はプラグインオプションスターターキットプラグインを使い始めた - http://www.presscoders.com/plugins/plugin-options-starter-kit/ 。これはいいプラグインです。それは実際にはまったくプラグインではありません、それはあなたが使いたいかもしれないすべてのオプションを持つ単なるプラグイン設定ページですので、あなたが望むことをするためにそれをコピー/貼り付け/カット/設定するのは簡単です。私の上記のコードがなぜうまく動かないのかまだよくわかりません(上に貼り付けたバージョンには検証機能がありませんが、それを元に戻しても問題は解決しませんでした)。これを機能させるために他に何をする必要があるかを教えてください。知りたいのですが。
問題は、更新プログラムをコーディングしているコード内の場所です。
フォームを送信すると、options.phpがロードされ、それを使ったプラグインがロードされます。その時点で、オプションは投稿データから更新されます。それからあなたはあなたの設定ページにリダイレクトされ、そしてあなたのコードは再び実行されますが、今回は$_POST
に値がないのであなたのオプションは空の値で埋められます。
Settings APIを使用している場合は、オプションの更新をそのままにしてください。たとえ更新コードが更新されていない場合でも
if (isset($_POST['wpa_ad_insert_paragraph'] )) {
pdate_option( 'wpa_ad_insert_paragraph', $_POST['wpa_ad_insert_paragraph'] );
update_option( 'wpa_ad_insert_adcode', $_POST['wpa_ad_insert_adcode'] );
}
Add_optionはupdate_optionのエイリアスになります。オプションが存在する場合はupdate_optionのように動作し、存在しないときにupdate_optionが呼び出されるとオプションが追加されます。そのため、初期化する前にオプションが存在しないことを確認する必要があります。
if (!get_option('wpa_ad_insert_paragraph')) {
add_option( 'wpa_ad_insert_paragraph', '2' );
add_option( 'wpa_ad_insert_adcode', 'ad code goes here');
}
オプションが存在しない場合、get_optionはfalseを返します(ただし、falseがオプションの値の1つである場合は注意が必要です)。
ここにいくつか問題があります。最初の問題は、ロジックから出力を分離する必要があるということです。基本的に、呼び出しているadmin_init
アクションはタイムラインが遅すぎるため、おそらく正しく実行されていません。ここでこの同じような質問と答えを見てください。 do_settings_sectionsを出力できません。理由がわからない
2番目の問題は、register_setting()
関数が実際にデータベースに設定オプションを作成しないことです。あなたはこのようなことをする必要があります:
// Register and define the settings
add_action('admin_init', 'wpa_ad_insert_admin_init');
function wpa_ad_insert_admin_init(){
// This will make sure your options are created in the database
if( false === get_option( 'wpa_ad_insert_options' ) ) {
add_option( 'wpa_ad_insert_options' );
}
register_setting(
'wpa_ad_insert_options',
'wpa_ad_insert_options',
'wpa_ad_insert_validate_options'
);
...
機能の最初の部分をチェックすると、設定を保存するオプションを作成していることを確認できます。ここでも同様の問題がありました: register_setting()が設定を作成しないのはなぜですか?
@MarkKaplunが彼の答えで言ったように、あなたはupdate_option
のものも削除し、WordPressにあなたのためにそれを処理させるべきです。
register_setting()
を使用するとき、2番目の引数はそれを保存したいデータベース内のオプションです。そのため、設定を登録する前にオプションが存在することを確認する必要があります。
一見すると私が上で述べた問題は最も大きいもののように見えますが、あなたがそれらを直した後に他のものがあるかもしれません、そしてそこで我々はそこから取り組むことができます。