以编程方式添加选项以“添加新”自定义字段下拉菜单


10

如何在“添加新”自定义字段下拉列表中添加预定义选项?

在此处输入图片说明

这是两个自动添加和显示新的自定义字段的示例:

  1. WordPress:在新帖子上添加默认自定义字段
  2. 自动创建自定义字段

那接近我想做的事。我的目标是向“添加新的”自定义字段下拉列表中添加预定义的选项,但是直到博客添加它们时才将它们显示为字段。

我想知道如何在不使用插件的情况下执行此操作。


如果您需要填写特定的字段,为什么不使用自定义的metabox?有许多选项可以轻松地做到这一点:Meta Box,WP Alchemy,高级自定义字段等
helgatheviking

@helgatheviking感谢您的提示!我将检查这些选项(Meta BoxWP AlchemyAdvanced Custom Fields);那些看起来真的很好!老实说,我主要是想知道如何不使用插件就做到这一点,因为我试图保持最小化并避免对需要解决的每个问题使用插件(我知道如果一个插件(例如,我)不小心)。:D
mhulse,

当然可以 您可以制作不带插件的元框(此处有很多示例,食典或只是通过谷歌搜索)。但是有时候插件可以完全满足您的需求或简化您的生活。
helgatheviking

@helgatheviking谢谢!很好的建议!我可能最终会使用插件,具体取决于我需要为该项目进行多少个meta框调整。再次感谢您的帮助/链接/建议,非常感谢!
mhulse,

仅供参考,与我同舟共济的其他人:WP Alchemy纯粹是为程序员设计的,看起来不错。由于上述原因,在以上列出的三个中,我认为我最喜欢WP Alchemy。其他人看起来也很酷,但是我更喜欢尽可能靠近代码。不过要注意的是,我不确定WP Alchemy或其他公司是否可以将默认选项添加到股票自定义字段下拉列表中。如果我最终只使用一个或全部,我将在此处回覆确认(或者,如果其他人可以确认,那将很酷!)
mhulse

Answers:


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个可以被视为多数民众赞成为此设置的默认限制。

请享用...


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 !!!! 我欠你一个人情。:)

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.