Agregar opciones programáticas para "agregar nuevo" menú desplegable de campos personalizados

10

¿Cómo puedo agregar opciones predefinidas al menú desplegable de "agregar nuevo" campo personalizado?

Aquíhaydosejemplosdeagregarymostrarnuevoscampospersonalizadosautomáticamente:

  1. WordPress: Agregar campos personalizados predeterminados en nuevas publicaciones
  2. Crear automáticamente un campo personalizado

Eso está cerca de lo que quiero hacer; mi objetivo es agregar opciones predefinidas al menú desplegable personalizado "agregar nuevo", pero no hacer que se muestren como campos hasta que el blogger las agregue.

Me gustaría saber cómo hacer esto sin usar un complemento.

    
pregunta mhulse 04.05.2013 - 02:14

3 respuestas

4

No puedes hacer eso con PHP puro, porque los campos se obtienen de los campos existentes y no hay ningún gancho. Pero puede usar JavaScript, verifique si el tipo de publicación admite campos personalizados y el campo todavía no existe, e insértelo:

<?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
}
    
respondido por el fuxia 04.05.2013 - 02:44
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');

Simplemente agrega el código anterior en cualquier lugar en la función de tus temas.php. Una vez que haya agregado el código anterior, agregaría 'www.cyberxoft.com' al menú desplegable como una de las opciones para seleccionar.

Si puede verlo, simplemente reemplace 'www.cyberxoft.com' con su nombre de campo requerido y actualice la página de administración. Cuando vea que sucedió, simplemente continúe y agregue tantos como desee, PERO recuerde que solo 30 podría verse como ese es el límite predeterminado establecido para él.

Disfruta ...

    
respondido por el CyberXoft 25.09.2014 - 17:37
1

A continuación se muestra una versión modificada del script awesome publicado por @toscho. Solo necesitaba la capacidad de crear <select> si aún no existía.

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

Estoy seguro de que mis adaptaciones JS podrían mejorarse, pero hace el trabajo. Volveré a publicar el código actualizado aquí si hago cambios / mejoras.

Gracias de nuevo @toscho !!!! Te debo una. :)

    
respondido por el mhulse 25.09.2013 - 01:30

Lea otras preguntas en las etiquetas