web-dev-qa-db-fra.com

Ajouter par programme des options pour "ajouter" nouveau champ personnalisé

Comment puis-je ajouter des options prédéfinies au menu déroulant "Ajouter un nouveau" champ personnalisé?

enter image description here

Voici deux exemples d'ajout et d'affichage automatiques de nouveaux champs personnalisés:

  1. WordPress: Ajout de champs personnalisés par défaut pour les nouveaux messages
  2. Créer automatiquement un champ personnalisé

C'est proche de ce que je veux faire. Mon objectif est d’ajouter des options prédéfinies au menu déroulant "Ajouter un nouveau", mais de ne pas les afficher sous forme de champs tant que le blogueur ne les a pas ajoutées.

J'aimerais savoir comment faire cela sans utiliser de plugin.

10
mhulse

Vous ne pouvez pas faire cela avec du PHP pur, car les champs sont extraits des champs existants, et il n'y a pas de hook. Mais vous pouvez utiliser JavaScript, vérifiez si le type de publication prend en charge les champs personnalisés et si le champ n'existe pas déjà - et insérez-le:

<?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
}
4
fuxia
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');

Il suffit d’ajouter le code ci-dessus n’importe où dans vos thèmes function.php. Une fois que vous avez ajouté le code ci-dessus, “www.cyberxoft.com” sera ajouté au menu déroulant en tant que l'une des options à sélectionner.

Si vous arrivez à le voir, remplacez simplement "www.cyberxoft.com" par votre nom de champ requis et actualisez la page d'administration. Lorsque vous constatez que cela s'est produit, ajoutez-en autant que vous le souhaitez MAIS souvenez-vous que 30 seulement pourraient l'être. considéré comme une limite par défaut.

Prendre plaisir...

2
CyberXoft

Vous trouverez ci-dessous une version modifiée du script awesome posté par @toscho. J'avais juste besoin de pouvoir créer le <select> s'il n'existait pas déjà.

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

Je suis sûr que mes adaptations JS pourraient être améliorées, mais le travail est fait. Je posterai le code mis à jour ici si j'apporte des modifications/améliorations.

Merci encore @toscho !!!! Je t'en dois une. :)

1
mhulse