Ajouter des options par programme pour «ajouter un nouveau» menu déroulant de champ personnalisé

10

Comment puis-je ajouter des options prédéfinies à la liste déroulante de champ personnalisé "ajouter un nouveau"?

entrez la description de l'image ici

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

  1. WordPress: Ajout de champs personnalisés par défaut sur 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" fichier personnalisé, mais de ne pas les afficher en tant que champs jusqu'à ce que le blogueur les ajoute.

Je voudrais savoir comment faire cela sans utiliser de plugin.

mhulse
la source
Si vous avez besoin de champs spécifiques remplis, pourquoi ne pas utiliser une métabox personnalisée? Il existe de nombreuses options pour le faire facilement: Meta Box, WP Alchemy, Advanced Custom Fields, etc.
helgatheviking
@helgatheviking Merci pour les conseils! Je vais vérifier ces options ( Meta Box , WP Alchemy et Advanced Custom Fields ); ceux-ci ont l'air vraiment sympa! Honnêtement, je suis surtout curieux de savoir comment faire cela sans utiliser de plugin car j'essaie de rester minimal et d'éviter d'utiliser un plugin pour chaque problème que je dois résoudre (je sais à quelle vitesse les plugins peuvent se développer si c'est le cas (c'est-à-dire moi ) ne fait pas attention). : D
mhulse
Chose sûre. Vous pouvez créer des métaboxes sans plugins (de nombreux exemples ici, le Codex ou simplement en recherchant sur Google). mais parfois les plugins peuvent faire exactement ce dont vous avez besoin ou vous simplifier la vie.
helgatheviking
@helgatheviking Merci! Très bon conseil! Je pourrais finir par utiliser un plugin en cours de route en fonction de la quantité de réglages que je dois apporter à ce projet. Merci encore pour l'aide / liens / conseils, je l'apprécie vraiment!
mhulse
Pour info, à n'importe qui d'autre dans le même bateau que moi: WP Alchemy a l'air sympa du seul point de vue qu'il est fait pour les programmeurs; sur les trois énumérés ci-dessus, je pense que j'aime WP Alchemy le mieux pour cette raison. Les autres ont l'air vraiment cool aussi, mais je préfère rester aussi proche du code que possible. Quelque chose à noter cependant, je ne sais pas si WP Alchemy ou les autres peuvent ajouter des options par défaut à la liste déroulante des champs personnalisés. Si je finis par en utiliser un, ou tous, je posterai ici avec confirmation (ou, si quelqu'un d'autre peut confirmer, ce serait cool!)
mhulse

Réponses:

4

Vous ne pouvez pas faire cela avec du PHP pur, car les champs sont récupérés à partir 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 que 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
}
fuxia
la source
Whoa, génial! J'essaye maintenant, merci! (+1) Je reviendrai pour marquer comme réponse une fois testé. Par curiosité, quel est le sens derrière # -*- coding: utf-8 -*-? Ce style de commentaire signifie-t-il quelque chose de spécial pour WordPress? Je vous remercie!!!! :)
mhulse
@MickyHulse # -*- coding: utf-8 -*-est un cookie d'encodage , il aide les éditeurs à détecter l'encodage du fichier. Vim, Scite et quelques autres éditeurs le liront. Une partie de mon modèle PHP standard.
fuxia
Marche parfaitement! J'ai mis à jour mon message avec quelques ajustements que j'ai apportés à votre code (j'ai dû créer le <select>s'il n'existait pas déjà). Merci beaucoup pour l'aide, je l'apprécie vraiment !!!!!
mhulse
... et merci pour les informations sur le cookie d'encodage , je n'avais jamais vu ça auparavant. Très appréciée.
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');

Ajoutez simplement le code ci-dessus n'importe où dans vos thèmes function.php. Après avoir ajouté le code ci-dessus, il ajouterait «www.cyberxoft.com» à la liste déroulante comme l'une des options à sélectionner.

Si vous arrivez à le voir, remplacez simplement 'www.cyberxoft.com' par le nom de votre champ requis et actualisez la page d'administration et quand vous voyez que cela s'est produit, allez-y et ajoutez autant que vous le souhaitez MAIS rappelez-vous que seulement 30 pourraient être vu comme c'est la limite par défaut définie pour cela.

Prendre plaisir...

CyberXoft
la source
1

Vous trouverez ci-dessous une version modifiée du script génial 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 cela fait le travail. Je posterai le code mis à jour ici si j'apporte des modifications / améliorations.

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

mhulse
la source