Как добавить пользовательские параметры блога в новую форму настройки блога?

17

Похоже, достаточно простое требование, но я изо всех сил:

  1. Я хочу добавить опциональное поле в «Добавить новый сайт» .
    Простой текстовый вариант подойдет. Как мне это сделать?

  2. Мне нужно сохранить эту опцию блога при создании сайта.

    Я знаю, что могу использовать хук 'wpmu_new_blog', который передает $metaпеременную с предоставленными параметрами, но мне интересно, есть ли способ сделать все это за один шаг, чтобы мне не пришлось выполнять другой запрос к БД, или еще хуже переопределить / заменить весь процесс создания сайта?

Примечания:

Я использую WP 3.3.1 с настройкой MultiSite. Я пишу плагин, который перечисляет все сайты, которые соответствуют указанному значению настраиваемого поля (назовем его «тип»).

Кроме того, я опытный разработчик PHP, но я все еще относительно новичок во взломе WordPress, поэтому, пожалуйста, предположим, что я еще не очень хорошо знаком со всеми различными функциями WP и хуками.

Брайан Лейси
источник

Ответы:

9

Соединяя два ответа (*), я создал плагин для добавления пользовательской мета-опции при регистрации нового сайта (внешнего и внутреннего) и отображения его значения в столбце на экране «Сайты».

Мультисайт Категории

введите описание изображения здесь введите описание изображения здесь ...

(*) ссылки на код

1 - WordPress + Multisite: как добавить пользовательские параметры блога для добавления формы нового сайта в Network Admin? @dennisg

2 - Мультисайт: как добавить пользовательские параметры блога в новую форму настройки блога? @tbuteler

Это add_action('wpmu_new_blog', 'add_new_blog_field');было объединено из двух ответов.

Я уже использовал код столбца ID в своем мультисайте, а также добавил столбец Категория в плагин.

[Обновить]

Пытался сделать столбец Category сортируемым, но кажется почти неразрешимым ...

См. Этот вопрос / ответ: фильтры 'request' и 'parse_query' не срабатывают ни в sites.php, ни в link-manager.php

[обновление 2]

Я переработал плагин, и теперь категории можно сортировать. Первая версия плагина теперь Gist (ссылка обновлена ​​в начале), а новая версия остается в GitHub.

brasofilo
источник
+1 Эй, это здорово, бразофило! Я с нетерпением жду возможности попробовать :)
Брайан Лейси
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 только потому, что вы уже получили награду, и оба - отличные ответы.
Брайан Лейси
Внушительный ответ здесь, спасибо. Любая идея, почему мое дополнительное поле добавляется в опции сайта, если я не позволяю update_blog_option () работать? Я повторил значения внутри process_extra_field_on_blog_signup () и exit (), и это сработало, extra_filed был добавлен в опции. Но когда я просто позволяю ему пройти без выхода (), extra_field НЕ добавляется в wp_xx_options.
Thatryan
@thatryan, это странно ... Либо что-то удаляет значения из базы данных (маловероятно), либо они вообще не добавляются. Попробуйте запустить еще несколько тестов и не стесняйтесь задавать вопрос, если у вас возникли проблемы с его выяснением. Имейте в виду, что этот ответ был, вероятно, для WordPress 3.5 или более ранней версии, поэтому они могли бы что-то изменить в более новых версиях ...
Томас Бутелер
-1

если вы посмотрите на код site-new.php, вы бы уже получили свой ответ - и это не так!

Нет никаких условий, проверяющих, можно ли что-либо добавить в форму. Однако я изучил файл и считаю, что вам придется вручную добавить это поле ввода в site-new.php и передать значение в виде мета в массиве в функцию wpmu_create_blog, которую вы найдете где-то рядом со строкой 77. НЕ ПРОВЕРЕНО, но читается от того, что делает функция, может быть то, что вы ищете.

george.n
источник