Програматично додайте параметри для "додавання нових" спеціального поля, що випадає


10

Як я можу додати заздалегідь задані параметри до розширення спеціального поля "додати нове"?

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

Ось два приклади автоматичного додавання та показу нових спеціальних полів:

  1. WordPress: додавання спеціальних полів за замовчуванням у нові повідомлення
  2. Автоматичне створення спеціального поля

Це близько до того, що я хочу зробити; моя мета - додати заздалегідь задані параметри до розширеного поданого файлу "додати нове", але не показувати їх полями, доки блогер не додасть їх.

Я хотів би знати, як це зробити, не використовуючи плагін.


Якщо вам потрібні конкретні поля, чому б не скористатися спеціальним метабоком? Існує багато варіантів, щоб зробити це легко: Meta Box, WP Alchemy, Advanced Custom Fields і т.д.
helgatheviking

@helgatheviking Дякую за поради! Я перевірю ці параметри ( Meta Box , WP Alchemy та Advanced Custom Fields ); вони виглядають дуже приємно! Чесно кажучи, мені в основному цікаво, як це зробити, не використовуючи плагін, оскільки я намагаюся залишатися мінімальним і уникати використання плагіна для кожної проблеми, яку мені потрібно вирішити (я знаю, як швидко плагіни можуть накопичуватися, якщо такі (тобто я ) не обережний). : D
mhulse

Певна річ. Ви можете створювати метабокси без плагінів (тут є безліч прикладів, Codex або просто за допомогою Google). але іноді плагіни можуть робити саме те, що вам потрібно, або зробити ваше життя набагато простішим.
helgatheviking

@helgatheviking Дякую! Чудова порада! Я можу в кінцевому підсумку використовувати плагін вниз по дорозі залежно від того, скільки ще мета-налаштувань мені потрібно зробити для цього проекту. Ще раз дякую за допомогу / посилання / поради, я дуже вдячний!
mhulse

FYI, будь-кому іншому в тому ж човні, як я: 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 -*-- це печиво , що кодує , воно допомагає редакторам виявити кодування файлів. Vim, Scite та деякі інші редактори прочитають його. Частина мого стандартного шаблону PHP.
фуксія

Працює чудово! Я оновив свою публікацію деякими твіками, які я вніс до вашого коду (мені довелося створити, <select>якщо його ще не було). Велике спасибі за допомогу, я дуже це вдячний !!!!!
mhulse

... і дякую за інформацію про печиво , що кодує , я цього раніше не бачив. Цінується.
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 може бути розглядається як встановлений для нього ліміт за замовчуванням

Насолоджуйтесь ...


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 !!!! Я у вас в боргу. :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.