Programemente agregue opciones para desplegar el campo personalizado "agregar nuevo"

10

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

ingrese la descripción de la imagen aquí

Aquí hay dos ejemplos de agregar y mostrar automáticamente nuevos campos personalizados:

  1. WordPress: Agregar campos personalizados predeterminados en nuevas publicaciones
  2. Auto crear 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.

mhulse
fuente
Si necesita completar campos específicos, ¿por qué no usar un metabox personalizado? Hay una gran cantidad de opciones que hay para hacer esto fácilmente: Meta Box, WP Alquimia, Advanced campos personalizados, etc
helgatheviking
@helgatheviking Gracias por los consejos! Comprobaré esas opciones ( Meta Box , WP Alchemy y Advanced Custom Fields ); esos se ven muy bien! Honestamente, tengo curiosidad por saber cómo hacer esto sin usar un complemento, ya que trato de mantenerme al mínimo y evitar usar un complemento para cada problema que necesito resolver (sé qué tan rápido pueden acumularse complementos si uno (es decir, yo ) no tiene cuidado). : D
mhulse
Cosa segura. Puede hacer metaboxes sin complementos (muchos ejemplos aquí, el Codex o simplemente buscando en Google). pero a veces los complementos pueden hacer exactamente lo que necesita o hacer su vida mucho más simple.
helgatheviking
@helgatheviking Gracias! ¡Buen consejo! Puede que termine usando un plugin en el futuro dependiendo de cuántos ajustes de meta box necesito hacer para este proyecto. Gracias de nuevo por la ayuda / enlaces / consejos, ¡realmente lo aprecio!
mhulse
Para su información, para cualquier otra persona en el mismo barco que yo: WP Alchemy se ve bien puramente desde el punto de vista de que está hecho para programadores; de los tres mencionados anteriormente, creo que me gusta WP Alchemy como el mejor por esa razón. Los otros también se ven geniales, pero prefiero estar lo más cerca posible del código. Sin embargo, hay que tener en cuenta que no estoy seguro de si WP Alchemy u otros pueden agregar opciones predeterminadas al menú desplegable de campos personalizados. Si termino usando uno o todos, volveré a publicar aquí con confirmación (o, si alguien más puede confirmar, ¡sería genial!)
mhulse

Respuestas:

4

No puede hacer eso con PHP puro, porque los campos se obtienen de los campos existentes y no hay gancho. Pero puede usar JavaScript, verificar si el tipo de publicación admite campos personalizados y el campo aún no existe, e insertarlo:

<?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
fuente
Whoa, genial! Probándolo ahora, gracias! (+1) Volveré a marcar como respuesta una vez probado. Solo por curiosidad, ¿cuál es el significado detrás # -*- coding: utf-8 -*-? ¿Ese estilo de comentario significa algo especial para WordPress? ¡¡¡¡Gracias!!!! :)
mhulse
@MickyHulse # -*- coding: utf-8 -*-es una cookie de codificación , ayuda a los editores a detectar la codificación del archivo. Vim, Scite y algunos otros editores lo leerán. Parte de mi plantilla PHP estándar.
fuxia
¡Funciona perfectamente! He actualizado mi publicación con algunos ajustes que hice a su código (tuve que crear el <select>si aún no existía). Muchas gracias por la ayuda, realmente lo aprecio !!!!!
mhulse
... y gracias por la información sobre la cookie de codificación , no la había visto antes. Muy 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');

Simplemente agregue el código anterior en cualquier lugar de sus temas function.php. Después de agregar 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 el nombre del campo requerido y actualice la página de administración y cuando vea que sucedió, continúe y agregue tantos como desee PERO recuerde que solo 30 podrían ser visto como ese es el límite predeterminado establecido para ello.

Disfrutar...

CyberXoft
fuente
1

A continuación se muestra una versión modificada del impresionante script publicado por @toscho. Solo necesitaba la capacidad de crear el <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. Publicaré el código actualizado aquí si hago cambios / mejoras.

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

mhulse
fuente