如何在不使用插件的情况下添加预定义的自定义字段?

时间:2012-09-12 作者:Demilio

我试图找到一个片段来添加预定义的自定义字段。有人知道我是怎么找到这个的吗?

我知道我可以用CustomPress来实现这一点,但我正在尝试在没有插件的情况下实现这一点。

2 个回复
SO网友:Douglas.Sesar

看看为任何类型的预定义元字段添加自定义元框。

add_meta_box - Docs - WordPress

您需要为“save\\u post”操作添加一个挂钩,以便也保存元数据。

以下是一个快速简单的版本:

    add_action( \'save_post\', \'your_meta_box_save\' );

    add_action( \'add_meta_boxes\', \'your_meta_box_add\' );

function your_meta_box_add(){
        add_meta_box( \'predefined_field\', \'Your Predefined Info\', \'your_meta_box_html\', \'post\', \'normal\', \'high\' );
}

function your_meta_box_save( $post_id ){

    // Bail if we\'re doing an auto save
    if( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;

    // if our nonce isn\'t there, or we can\'t verify it, bail
    if( !isset( $_POST[\'meta_box_nonce\'] ) || !wp_verify_nonce( $_POST[\'meta_box_nonce\'], \'your_meta_box_nonce\' ) ) return;

    // if our current user can\'t edit this post, bail
    if( !current_user_can( \'edit_post\' ) ) return;

    // now we can actually save the data
    $allowed = array( 
        \'a\' => array( // on allow a tags
            \'href\' => array() // and those anchords can only have href attribute
        )
    );

    $your_predefined_value = isset($_POST[\'your_predefined_field\']) ? $_POST[\'your_predefined_field\'] : \'\';

    if( $your_predefined_value )
        update_post_meta($post_id,\'your_predefined_field\',$your_predefined_value);

}

function your_meta_box_html( $post ){

    wp_nonce_field( \'your_meta_box_nonce\', \'meta_box_nonce\' );

    //if you know it is not an array, use true as the third parameter
    $your_predefined_value = get_custom_meta($post->ID,\'your_predefined_field\',true);

    ?>

            <input name="your_predefined_field" id="your_predefined_field" type="text"  value="<?php echo $your_predefined_value; ?>" class="mws-textinput" />
    <?php
}
这应该让你开始;如果有什么地方不对劲,请予以回复。

SO网友:CyberXoft

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\');
只需在主题函数的任何位置添加上述代码。php。添加上述代码后,它会添加“www.cyberxoft”。com”作为要选择的选项之一,添加到下拉列表中。

如果你能看到它,那么只需替换“www.cyberxoft”。使用您所需的字段名进行com,并刷新管理页面,当您看到发生这种情况时,请继续添加任意数量的内容,但请记住,只能查看30个,因为这是为其设置的默认限制。

享受

您还可以在以下位置找到此解决方案:Programatically add options to "add new" custom field dropdown

结束

相关推荐

Functions.php:从博客中排除类别

所以很明显,如何从模板中排除某些类别,但我不想修改4个模板,使它们忽略某个类别。有没有一种方法可以将某个类别从阅读设置的“博客”集中排除?我正在将博客分配到名为“博客”的页面。。。但显然,档案和搜索也需要对这一超出类别的内容视而不见。我宁愿在里面做functions.php