Ajoute par programme des options au menu déroulant «Ajouter un nouveau» champ

10

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

Voicideuxexemplesd'ajoutetd'affichageautomatiquesdenouveauxchampspersonnalisés:

  1. WordPress: Ajout de champs personnalisés par défaut aux nouveaux messages
  2. Créer 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.

    
posée mhulse 04.05.2013 - 02:14

3 réponses

4

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érifier si le type de publication prend en charge les champs personnalisés et si le champ n'existe pas déjà - et l'insérer:

<?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
}
    
réponse donnée 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');

Ajoutez simplement 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 comme l'une des options à sélectionner.

Si vous arrivez à le voir, remplacez simplement "www.cyberxoft.com" par le nom de champ requis et actualisez la page d'administration. Lorsque cela se produit, continuez et ajoutez-en autant que vous voulez, mais rappelez-vous que seulement 30 peut être considéré comme une limite par défaut.

Profitez de ...

    
réponse donnée CyberXoft 25.09.2014 - 17:37
1

Vous trouverez ci-dessous une version modifiée du script awesome publié 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. :)

    
réponse donnée mhulse 25.09.2013 - 01:30

Lire d'autres questions sur les étiquettes