Программно добавлять опции, чтобы «добавить новый» выпадающий список настраиваемых полей

10

Как добавить предопределенные параметры в раскрывающееся меню «Добавить новое»?

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

Вот два примера автоматического добавления и отображения новых настраиваемых полей:

  1. WordPress: добавление пользовательских полей по умолчанию в новые сообщения
  2. Автоматическое создание настраиваемого поля

Это близко к тому, что я хочу сделать; Моя цель состоит в том, чтобы добавить предопределенные параметры в выпадающий список «добавить новые», но не показывать их в виде полей, пока блоггер не добавит их.

Я хотел бы знать, как сделать это без использования плагина.

mhulse
источник
Если вам нужно заполнить определенные поля, почему бы не использовать пользовательский метабокс? Есть много вариантов сделать это легко: Meta Box, WP Alchemy, Advanced Custom Fields и т. Д.
helgatheviking
@helgatheviking Спасибо за советы! Я проверю эти опции ( Meta Box , WP Alchemy и Advanced Custom Fields ); те выглядят действительно хорошо! Честно говоря, мне в основном любопытно, как это сделать без использования плагина, так как я стараюсь оставаться минимальным и избегать использования плагина для каждой проблемы, которую мне нужно решить (я знаю, как быстро плагины могут быть созданы, если таковые есть (т.е. я ) не осторожен). : D
Mhulse
Конечно, вещь. Вы можете создавать метабоксы без плагинов (множество примеров здесь, в Кодексе или просто путем поиска в Google). но иногда плагины могут сделать именно то, что вам нужно, или сделать вашу жизнь намного проще.
helgatheviking
@helgatheviking Спасибо! Отличный совет! Я могу в конечном итоге использовать плагин в будущем, в зависимости от того, сколько еще настроек метабокса мне нужно сделать для этого проекта. Еще раз спасибо за помощь / ссылки / советы, я действительно ценю это!
mhulse
К вашему сведению, всем, кто находится в той же лодке, что и я: WP Alchemy выглядит красиво с точки зрения того, что он создан для программистов; из трех перечисленных выше я думаю, что мне больше всего нравится WP Alchemy по этой причине. Другие тоже выглядят очень круто, но я предпочитаю оставаться как можно ближе к коду. Однако стоит отметить, что я не уверен, что WP Alchemy или другие могут добавить параметры по умолчанию в выпадающий список стандартных полей. Если я в конечном итоге использую один или все, я отправлю сюда с подтверждением (или, если кто-то еще может подтвердить, это было бы круто!)
mhulse

Ответы:

4

Вы не можете сделать это с чистым PHP, потому что поля извлекаются из существующих полей, и нет никакой ловушки. Но вы можете использовать JavaScript, проверить, поддерживает ли тип записи пользовательские поля, и поле уже не существует - и вставить его:

<?php # -*- coding: utf-8 -*-
/* Plugin Name: Extend custom fields */

add_action( 'admin_footer-post-new.php', 'wpse_98269_script' );
add_action( 'admin_footer-post.php', 'wpse_98269_script' );

function wpse_98269_script()
{
    if ( ! isset ( $GLOBALS['post'] ) )
        return;

    $post_type = get_post_type( $GLOBALS['post'] );

    if ( ! post_type_supports( $post_type, 'custom-fields' ) )
        return;
    ?>
<script>
    if ( jQuery( "[value='demo_data']" ).length < 1 ) // avoid duplication
        jQuery( "#metakeyselect").append( "<option value='demo_data'>demo_data</option>" );
</script>
    <?php
}
Фуксия
источник
Вау, классно! Пробую сейчас, спасибо! (+1) Я вернусь, чтобы пометить как ответ после проверки. Просто из любопытства, что за этим стоит # -*- coding: utf-8 -*-? Означает ли этот стиль комментариев что-то особенное для WordPress? Спасибо!!!! :)
Mhulse
@MickyHulse # -*- coding: utf-8 -*-- это файл cookie для кодирования , он помогает редакторам определить кодировку файла. Vim, Scite и некоторые другие редакторы будут читать его. Часть моего стандартного шаблона PHP.
Fuxia
Работает отлично! Я обновил свой пост некоторыми изменениями, которые я внес в ваш код (я должен был создать, <select>если он еще не существует). Большое спасибо за помощь, я действительно ценю это !!!!!
mhulse
... и спасибо за информацию о кодировке cookie , я раньше такого не видел. Очень признателен.
mhulse
2
function add_predefined_custom_field_names( $query ) {
    $predefined = array(
        'www.cyberxoft.com'
    );

    global $table_prefix;

    $query = preg_replace('/[\r\n\t]/', ' ', $query); //minify by removing all tabs and line breaks
    $query = preg_replace('/\s+/', ' ', $query); //minify by replacing spaces, tabs and carriages to single space

    //SELECT meta_key FROM wp_postmeta GROUP BY meta_key HAVING meta_key NOT LIKE '\\_%' ORDER BY meta_key LIMIT 30
    $pattern = ("/SELECT meta_key FROM ".$table_prefix."postmeta/i");   

    if( preg_match($pattern, $query) ) {
        $keys = '';     

        foreach($predefined as $key){$keys .= (" UNION SELECT '$key' AS meta_key");}        

        $query = preg_replace('/SELECT/i', 'SELECT meta_key FROM (SELECT', $query);
        $query = preg_replace('/FROM wp_postmeta/i', ('FROM wp_postmeta'.$keys), $query);
        $query = preg_replace('/ GROUP BY/i', ')t GROUP BY', $query);
    }

    return $query;
}
add_filter('query', 'add_predefined_custom_field_names');

Просто добавьте приведенный выше код в любом месте вашей темы function.php. После того, как вы добавили приведенный выше код, он добавил бы «www.cyberxoft.com» в раскрывающийся список как один из вариантов выбора.

Если вы увидите его, просто замените «www.cyberxoft.com» на требуемое имя поля и обновите страницу администратора, а когда увидите, что произошло, просто добавьте столько, сколько хотите, НО помните, что только 30 может быть рассматривается как установленный для него лимит по умолчанию.

Наслаждаться...

CyberXoft
источник
1

Ниже приведена модифицированная версия потрясающего скрипта, опубликованного @toscho. Мне просто нужна была возможность создать объект, <select>если он еще не существует.

/**
 * Programatically add custom fields.
 *
 * @see http://wordpress.stackexchange.com/questions/98269/programatically-add-options-to-add-new-custom-field-dropdown/
 */

function wpse_98269_script() {

    if (isset($GLOBALS['post'])) {

        $post_type = get_post_type($GLOBALS['post']);

        if (post_type_supports($post_type, 'custom-fields')) {

            ?>

                <script>

                    // Cache:
                    var $metakeyinput = jQuery('#metakeyinput'),
                        $metakeyselect = jQuery('#metakeyselect');

                    // Does the default input field exist and is it visible?
                    if ($metakeyinput.length && ( ! $metakeyinput.hasClass('hide-if-js'))) {

                        // Hide it:
                        $metakeyinput.addClass('hide-if-js'); // Using WP admin class.

                        // ... and create the select box:
                        $metakeyselect = jQuery('<select id="metakeyselect" name="metakeyselect">').appendTo('#newmetaleft');

                        // Add the default select value:
                        $metakeyselect.append('<option value="#NONE#">— Select —</option>');

                    }

                    // Does "demo_data" already exist?
                    if (jQuery("[value='demo_data']").length < 1) {

                        // Add option:
                        $metakeyselect.append("<option value='demo_data'>demo_data</option>");

                    }

                </script>

            <?php

        }

    }

}

add_action('admin_footer-post-new.php', 'wpse_98269_script');
add_action('admin_footer-post.php', 'wpse_98269_script');

Я уверен, что моя адаптация JS может быть улучшена, но она выполняет свою работу. Я опубликую обновленный код здесь, если я внесу изменения / улучшения.

Еще раз спасибо @toscho !!!! Я твой должник. :)

mhulse
источник