如何将自定义博客选项添加到新的博客设置表单?


17

看起来很简单,但是我很挣扎:

  1. 我想在“添加新站点”中添加一个选项字段
    一个简单的文本选项就可以了。我该怎么做呢?

  2. 创建网站时,我需要保存此自定义博客选项。

    我知道我可以使用“ wpmu_new_blog”钩子,该钩子$meta使用提供的选项传递变量,但是我想知道是否有一种方法可以一步完成所有操作,因此我不必执行另一个数据库查询,或者更糟,覆盖/替换整个网站创建过程?

笔记:

我正在使用WP 3.3.1和MultiSite设置。我正在写一个插件,列出与指定的自定义字段值匹配的所有站点(我们称其为“类型”)。

另外,我是一位经验丰富的PHP开发人员,但是我对WordPress黑客还比较陌生,因此请假定我还不熟悉所有各种WP函数和挂钩。

Answers:


9

结合两个答案(*),我做了一个插件,可以在注册新网站(前端和后端)时添加自定义meta选项,并将其值显示在“网站”屏幕的列中。

多站点类别

在此处输入图片说明 在此处输入图片说明 ...

(*)代码参考

1- WordPress +多站点:如何在Network Admin中添加自定义博客选项以添加新站点表单?由@dennisg

2-多站点:如何将“自定义博客选项”添加到新的博客设置表单中?由@tbuteler

add_action('wpmu_new_blog', 'add_new_blog_field');从两个答案合并。

我已经在多站点中使用了ID列代码,并且还在插件中添加了Category列。

[更新]

试图使Category列可排序,但似乎几乎无法解决...

看到这个问题/答案:过滤'request'和'parse_query'不在site.php和link-manager.php中触发

[更新2]

我对插件进行了重新设计,现在类别可以排序了。该插件的第一个版本现在是Gist(链接在开始时已更新),新版本保留在GitHub中。


+1嘿,太好了,brasofilo!我期待尝试:)
Brian Lacy 2012年

8

调整多站点注册过程并非易事。与其他流程不同,它确实有很多需要配合的地方,但是对于大量的自定义而言,它们似乎并没有很好地融合在一起,所以我理解您的无奈。

如果我理解正确的话,实现您想要的目标并不复杂,尽管在不重写WordPress的许多默认行为的情况下这不是一个一步的解决方案,这主要是因为注册(即用户何时将提交自定义信息)和激活(例如,何时实际创建新博客)将分别发生。

这是一个非常粗糙的代码,您将需要开始。希望它能引导您朝正确的方向前进:

// Add text field on blog signup form
add_action('signup_blogform', 'add_extra_field_on_blog_signup');
function add_extra_field_on_blog_signup() { ?>
    <label>An extra field</label>
    <input type="text" name="extra_field" value="" />
<?php
}

// Append the submitted value of our custom input into the meta array that is stored while the user doesn't activate
add_filter('add_signup_meta', 'append_extra_field_as_meta');
function append_extra_field_as_meta($meta) {
    if(isset($_REQUEST['extra_field'])) {
        $meta['extra_field'] = $_REQUEST['extra_field'];
    }
    return $meta;
}

// When the new site is finally created (user has followed the activation link provided via e-mail), add a row to the options table with the value he submitted during signup
add_action('wpmu_new_blog', 'process_extra_field_on_blog_signup', 10, 6);
function process_extra_field_on_blog_signup($blog_id, $user_id, $domain, $path, $site_id, $meta) {
    update_blog_option($blog_id, 'extra_field', $meta['extra_field']);
}

记住:

  1. 如果要通过插件过滤输入,我强烈建议您使用选择输入来锁定提供的选项。
  2. 由于某些字段是必填字段,并且需要在注册过程中通过验证(最小字符,网站名称不允许使用的字符,黑名单名称等),因此建议在第一个字段中填充输入值时在$ _REQUEST全局上检查您的额外字段功能,以便用户在输回以修复WordPress默认字段值的情况下不会丢失输入;
  3. 您显然可以用最适合您的插件的方式替换最后一个功能的想法,但是现在可以从最后一个功能中获取该字段的值,这将对您有所帮助。

最后一点,如果您以后要处理所有现有博客的所有“ extra_field”值,我强烈建议将信息存储在单个表中。可能会使用update_site_option而不是update_blog_option最后一个函数,从而丢失blog_id,在这种情况下这不是必需的。

无论如何,让我们知道进展如何,祝您好运!


有用的好答案,很多信息,我可以在这里利用:)我之所以授予brasofilo最佳答案,是因为您已经获得了赏金,而这两个都是很好的答案。
Brian Lacy 2012年

很棒的答案,谢谢。如果我不运行update_blog_option(),为什么我的额外字段会添加到站点选项中呢?我回显了process_extra_field_on_blog_signup()和exit()内部的值,并且它起作用了,extra_filed已添加到选项中。但是,当我只让它运行而没有exit()时,则extra_field不会添加到wp_xx_options中。
thatryan 2014年

@thatryan,这很奇怪...要么是从数据库中删除值(不太可能),要么根本没有添加它们。尝试运行更多测试,如果您无法确定问题,请随时提出问题。请记住,这个答案可能是针对WordPress 3.5或更早版本的,因此他们可能已在较新版本中进行了更改...
Tomas Buteler 2014年

-1

如果您查看site-new.php代码,您将已经得到答案-那就不是!

没有条件检查是否可以在表单中添加任何内容。但是,我研究了该文件,并认为您必须在site-new.php中手动添加此输入字段,并将该值作为数组中的meta传递给wpmu_create_blog函数,您将在第77行附近找到该函数。在什么功能上可能是您要寻找的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.