web-dev-qa-db-ja.com

プラグインオプションページでのカスタムメタボックスの作成

私のメインプラグインファイル、wp-email-capture.phpの中で私はこれを呼んでいます: -

add_action( 'admin_init', 'wp_email_capture_add_custom_boxes');

これは、この機能を呼び出します: -

function wp_email_capture_add_custom_boxes()
{
       add_meta_box("wp_email_capture_admin_supportbox", __('Support', 'WPEC'), "wp_email_capture_admin_supportbox", "wpemailcaptureoptions","side");
       //do_meta_boxes( 'wpemailcaptureoptions', 'normal' , NULL); - removed as per SE advice
}

そして、別にこの機能: -

function wp_email_capture_admin_supportbox()
{
        echo "<p>If you are having problems with this plugin, please read the Frequently Asked Questions, or alternatively submit a support request.</p>";
}

WP Email Capture Optionsページ(wpemailcaptureオプションのスラッグがあります)を開きましたが、ボックスやサイドバーに何も表示されません。それは私を完全に困惑させました。

私は疑わしいそれがどのように呼ばれているのかということです、私はadd_action('add_meta_box',...を試してみましたが、それから関数さえ呼ばれていませんでした。

アイデア?

あなたが他に何かを必要とするならば、私に知らせてください:)

編集

私は今 "do_meta_boxes"をメタボックスが表示されていてまだ喜びのないオプションページに移動しました。オプションページを管理する関数は次のとおりです -

function wp_email_capture_show_lists()
{
    $lists = wpecp_get_all_lists();
do_meta_boxes( 'wpemailcaptureoptions', 'normal' , NULL);
    echo '<div class="wrap">';
    echo '<img src="'.plugins_url('images/logolarge.png' , dirname(__FILE__)).'" align="right" style="padding-right: 5%" alt="WP Email Capture"> <h2>Lists</h2>';
?>  
<table class="widefat">
<thead>
<tr>
    <th><?php _e('List Name','WPEC'); ?></th>
    <th><?php _e('Edit','WPEC'); ?></th>      
    <th><?php _e('Delete','WPEC'); ?></th>
</tr>
</thead>
<tfoot>
<tr>
    <th><?php _e('List Name','WPEC'); ?></th>
    <th><?php _e('Edit','WPEC'); ?></th>      
    <th><?php _e('Delete','WPEC'); ?></th>
</tr>
</tfoot>
<tbody>

<?php

foreach ($lists as $list)
{

?>
    <tr valign="top">
    <th scope="row" style="width:400px"><?php echo $list->listid .". ". $list->listname; ?></th>

<?php 
    if ($list->listtype == 2)
    {

        $url = $_SERVER["REQUEST_URI"] . "&wpecr_listid=".$list->listid."&external=1";

    } else {

        $url = $_SERVER["REQUEST_URI"] . "&wpecr_listid=".$list->listid;
    }
 ?>

    <td><a href="<?php echo $url; ?>">Edit</a></td><td>

 <?php 
    if ($list->listid != get_option('wp_wpecp_default_list'))
    {

        $url = $_SERVER["REQUEST_URI"] . "&delete_listid=".$list->listid;

?>  
        <a href="<?php echo $url; ?>">Delete</a> 
<?php
    }
?>
    </td>
    </tr>
<?php
    }

    echo '</tbody></table>';
    echo "<p><a href='" . $_SERVER["REQUEST_URI"] ."&wpecr_listid=0' class='button-secondary'>Add New WP Email Capture List</a> <a href='" . $_SERVER["REQUEST_URI"] ."&wpecr_listid=0&external=1' class='button-secondary'>Add New External List</a></p>";
    echo '</div></div>';

} ?>
1
Rhys Wynne

admin_initフックではなく、プラグインオプションページで do_meta_boxes() を呼び出す必要があります。

1
Bainternet

メタボックスに問題があるのは、コンテキストが一致しないからです。

add_meta_boxを呼び出すときは、側面として$context引数(5番目)を指定します。 do_meta_boxesを呼び出すときは、コンテキスト(2番目の引数)normalを使用して呼び出します。どちらかを変更する必要がありますが、それらは一致する必要があります。

メタボックスを正しく表示するには、クラスmetabox-holderを持つコンテナ内にメタボックスを配置する必要があります。

あなたのコードは次のようになります。

<?php
function wp_email_capture_show_lists()
{
    $lists = wpecp_get_all_lists();
    echo '<div class="wrap metabox-holder">';
    do_meta_boxes('wpemailcaptureoptions', 'side' , NULL);

    // snip snip

    echo '</div>'; // close the wrap
}

この質問に私は興味をそそられたので、私 がメタボックス+カスタムページの設定APIをどのように使用できるかの例 を書きました。あなたを助けるかもしれません:

<?php

WPSE57092::init();

class WPSE57092
{
    /**
     * The hook to add an action to add our meta boxes.
     *
     */
    const ADD_HOOK = 'wpse57092_add_boxes';

    /**
     * The page key for our meta boxes.  You could use this as the "group" for
     * the settings API as well or something similar.
     *
     */
    const PAGE = 'do_wpse57092_boxes';

    /**
     * The setting key.
     *
     */
    const SETTING = 'wpse57092_opts';

    public static function init()
    {
        add_action(
            'admin_menu',
            array(__CLASS__, 'page')
        );

        add_action(
            self::ADD_HOOK,
            array(__CLASS__, 'meta_box')
        );

        add_action(
            'admin_init',
            array(__CLASS__, 'settings')
        );
    }

    public static function settings()
    {
        register_setting(
            self::PAGE,
            self::SETTING,
            array(__CLASS__, 'validate')
        );

        add_settings_section(
            'default',
            __('A Settings Section', 'wpse57092'),
            '__return_false',
            self::PAGE
        );

        add_settings_field(
            'wpse57092-text',
            __('Some Field', 'wpse57092'),
            array(__CLASS__, 'field_cb'),
            self::PAGE,
            'default',
            array('label_for' => self::SETTING)
        );
    }

    public static function meta_box()
    {
        add_meta_box(
            'custom-meta-wpse57092',
            __('Just Another Meta Box', 'wpse57092'),
            array(__CLASS__, 'box_cb'),
            self::PAGE,
            'main',
            'high'
        );
    }

    public static function box_cb($setting)
    {
        // do_settings_fields doesn't do form tables for you.
        echo '<table class="form-table">'; 
        do_settings_fields(self::PAGE, 'default');
        echo '</table>';
    }

    public static function field_cb($args)
    {
        printf(
            '<input type="text" id="%1$s" name="%1$s" class="widefat" value="%2$s" />',
            esc_attr($args['label_for']),
            esc_attr(get_option($args['label_for']))
        );
        echo '<p class="description">';
        _e('Just some help text here', 'wpse57092');
        echo '</p>';
    }

    public static function page()
    {
        $p = add_options_page(
            __('WPSE 57092 Options', 'wpse57092'),
            __('WPSE 57092', 'wpse57092'),
            'manage_options',
            'wpse57092-options',
            array(__CLASS__, 'page_cb')
        );
    }

    public static function page_cb()
    {
        do_action(self::ADD_HOOK);
        ?>
        <div class="wrap metabox-holder">
            <?php screen_icon(); ?>
            <h2><?php _e('WPSE 57092 Options', 'wpse57092'); ?></h2>
            <p>&nbsp;</p>
            <form action="<?php echo admin_url('options.php'); ?>" method="post">
                <?php
                settings_fields(self::PAGE);
                do_meta_boxes(self::PAGE, 'main', self::SETTING);
                ?>
            </form>
        </div>
        <?php
    }

    public static function validate($dirty)
    {
        return esc_url_raw($dirty);
    }
}
1
chrisguitarguy