Adicione opções de programação a "adicionar novo" menu suspenso personalizado

10

Como posso adicionar opções predefinidas ao menu suspenso "adicionar novo" campo personalizado?

insira a descrição da imagem aqui

Aqui estão dois exemplos de adição e exibição automáticas de novos campos personalizados:

  1. WordPress: Adicionando campos personalizados padrão em novas postagens
  2. Criar campo personalizado automaticamente

É perto do que eu quero fazer; meu objetivo é adicionar opções predefinidas ao menu suspenso "adicionar novo" personalizado, mas não mostrar como campos até que o blogueiro as adicione.

Eu gostaria de saber como fazer isso sem usar um plugin.

mhulse
fonte
Se você precisar de campos específicos preenchidos, por que não usar uma metabox personalizada? Há um monte de opções lá fora, para fazer isso facilmente: Meta Box, WP Alchemy, Advanced Custom Fields, etc
helgatheviking
@helgatheviking Obrigado pelas dicas! Vou verificar essas opções ( Meta Box , WP Alchemy e Advanced Custom Fields ); aqueles parecem muito legais! Honestamente, estou curioso em saber como fazer isso sem usar um plug-in, pois estou tentando permanecer mínimo e evito usar um plug-in para todos os problemas que preciso resolver (sei como os plug-ins podem ser construídos rapidamente, se houver um (por exemplo, eu ) não é cuidadoso). : D
mhulse
Coisa certa. Você pode criar metaboxes sem plugins (muitos exemplos aqui, no Codex ou apenas pesquisando no Google). mas às vezes os plug-ins podem fazer exatamente o que você precisa ou tornar sua vida muito mais simples.
Helgatheviking 5/05
@helgatheviking Thanks! Ótimo conselho! Eu posso acabar usando um plugin no caminho, dependendo de quanto mais ajustes de meta box eu preciso fazer para este projeto. Mais uma vez obrigado pela ajuda / links / conselhos, eu realmente aprecio isso!
Mhulse
Para sua informação, para qualquer pessoa que esteja no mesmo barco que eu: o WP Alchemy parece bem puramente do ponto de vista que é feito para programadores; dos três listados acima, acho que gosto mais do WP Alchemy por esse motivo. Os outros parecem muito legais também, mas eu prefiro ficar o mais próximo possível do código. No entanto, não tenho certeza se o WP Alchemy ou os outros podem adicionar opções padrão ao menu suspenso de ações personalizadas. Se eu acabar usando um, ou todos, vou postar aqui atrás com a confirmação (ou, se alguém pode confirmar, isso seria legal!)
mhulse

Respostas:

4

Você não pode fazer isso com PHP puro, porque os campos são buscados nos campos existentes e não há gancho. Mas você pode usar JavaScript, verifique se o tipo de postagem suporta campos personalizados e o campo já não existe - e insira-o:

<?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
}
fuxia
fonte
Uau, incrível! Tentando agora, obrigado! (+1) Voltarei a marcar como resposta uma vez testado. Apenas por curiosidade, qual é o significado por trás # -*- coding: utf-8 -*-? Esse estilo de comentário significa algo especial para o WordPress? Obrigado!!!! :)
mhulse
O @MickyHulse # -*- coding: utf-8 -*-é um cookie de codificação , ajuda os editores a detectar a codificação do arquivo. Vim, Scite e alguns outros editores o lerão. Parte do meu modelo PHP padrão.
fuxia
Funciona perfeitamente! Atualizei minha postagem com alguns ajustes que fiz no seu código (tive que criar o <select>se ainda não existisse). Muito obrigado pela ajuda, eu realmente aprecio isso !!!!!
Mhulse
... e obrigado pela informação sobre o cookie de codificação , eu nunca tinha visto isso antes. Muito apreciado.
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');

Basta adicionar o código acima em qualquer lugar nos seus temas function.php. Depois de adicionar o código acima, ele adicionaria 'www.cyberxoft.com' ao menu suspenso como uma das opções a serem selecionadas.

Se você conseguir vê-lo, basta substituir 'www.cyberxoft.com' pelo nome do campo necessário e atualizar a página de administração. Quando você perceber o ocorrido, vá em frente e adicione quantos quiser, mas lembre-se de que apenas 30 visto como esse é o limite padrão definido para ele.

Desfrutar...

CyberXoft
fonte
1

Abaixo está uma versão modificada do incrível script postado por @toscho. Eu só precisava da capacidade de criar o <select>se ainda não existisse.

/**
 * 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');

Tenho certeza de que minhas adaptações de JS podem ser melhoradas, mas isso faz o trabalho. Postarei o código atualizado aqui se eu fizer alterações / melhorias.

Mais uma vez obrigado @toscho !!!! Eu devo-te uma. :)

mhulse
fonte