16

在我正在自定义的 WordPress 多站点安装中,我需要在输入表单中添加一个简单的文本字段以创建新的博客站点,该表单位于

Network Admin > Sites > Add New

自然,我需要将此字段与该表单中的其他元数据一起保存在{new_blog_prefix}_options表格中。

我对实现这一目标的最简单、最直接和/或“正确的方式”(即 WordPress 方式)特别感兴趣,但我会满足于 The Way That Works™!

到目前为止,我在研究中遇到了许多死胡同:

  • 设置 API - [ WP Codex ]

    据我所知,Settings API (a) 可能不适用于 Network Admin 部分(尽管这在 WP 的最新版本中可能已经改变);此外,(b)似乎这只允许您Settings在仪表板部分添加/修改屏幕。

  • wpmu_options钩子 - [钩子数据库]

    似乎是专门用于向“网络设置”屏幕添加选项的钩子。

  • add_site_option / add_blog_option - [ WP Codex ]

    我能找到的最近的;似乎允许向{blogsite_prefix}_options表中添加特定于站点的选项,但仍无助于向管理表单添加选项。

所以......没有骰子。任何帮助表示赞赏!

4

1 回答 1

28

如果您查看“添加新站点”页面的源代码,您会发现 WordPress 没有为此目的提供挂钩。当然,也可以自己添加一个钩子,但编辑 WordPress 核心通常是不好的做法。

但是,一旦提交并且所有信息都存在,页面就会调用函数wpmu_create_blog()。在这个函数中有一个钩子被调用,即 action wpmu_new_blog

do_action( 'wpmu_new_blog', $blog_id, $user_id, $domain, $path, $site_id, $meta );

至此,博客已经创建完毕。但是,我们仍然可以通过挂钩此操作并将其保存到数据库中来检测字段是否已提交。我们将以下内容添加到我们的插件文件(或模板)中:

function add_new_blog_field($blog_id, $user_id, $domain, $path, $site_id, $meta) {

    // Make sure the user can perform this action and the request came from the correct page.

    switch_to_blog($blog_id);

    // Use a default value here if the field was not submitted.
    $new_field_value = 'default';

    if ( !empty($_POST['blog']['new_field']) )
        $new_field_value = $_POST['blog']['new_field'];

    // save option into the database
    update_option( 'new_field', $new_field_value);

    restore_current_blog();
}

add_action( 'wpmu_new_blog', 'add_new_blog_field' );

至于在页面上显示字段,您可以使用 JavaScript 方法。您添加一个 javascript 文件,仅添加到“添加新站点”页面,然后在页面的 onLoad 中将字段插入页面上的正确位置。您应该添加一个名为“blog[new_field]”的输入字段。我们创建以下 JavaScript 文件,该文件一旦加载,就会向“添加新站点”页面添加一个新字段:

(function($) {
    $(document).ready(function() {
        $('<tr class="form-field form-required"></tr>').append(
            $('<th scope="row">New field</th>')
        ).append(
            $('<td></td>').append(
                $('<input class="regular-text" type="text" title="New Field" name="blog[new_field]">')
            ).append(
                $('<p>Explanation about your new field</p>')
            )
        ).insertAfter('#wpbody-content table tr:eq(2)');
    });
})(jQuery);

现在剩下要做的就是将此文件包含到“添加新站点”页面中,方法是将其添加到您的插件文件中:

// Only add the script for the page site-new.php (the page hook).
add_action( "admin_print_scripts-site-new.php", 'my_admin_scripts' );

function my_admin_scripts() {
    wp_register_script('yourScript', plugins_url('js/yourScript.js', __FILE__));
    wp_enqueue_script('yourScript');
}

根据您的需要,进一步的建议可能是:使用add_settings_field在您的常规设置页面中添加一个输入字段,以便用户稍后可以编辑它(并且可能仅当它是该字段的默认设置时)。“您以后不能更改此字段”的方法。

我希望这是您需要的帮助。

于 2012-04-29T14:25:23.617 回答