Aggiungi programmaticamente opzioni al menu a discesa "aggiungi nuovo" campo personalizzato


10

Come posso aggiungere opzioni predefinite al menu a discesa "aggiungi nuovo" campo personalizzato?

inserisci qui la descrizione dell'immagine

Ecco due esempi di aggiunta e visualizzazione automatica di nuovi campi personalizzati:

  1. WordPress: aggiunta di campi personalizzati predefiniti nei nuovi post
  2. Crea automaticamente un campo personalizzato

È vicino a quello che voglio fare; il mio obiettivo è quello di aggiungere opzioni predefinite al menu a discesa "aggiungi nuovo" personalizzato, ma non farle mostrare come campi fino a quando il blogger non le aggiunge.

Mi piacerebbe sapere come farlo senza usare un plugin.


Se hai bisogno di campi specifici compilati, perché non utilizzare un metabox personalizzato? Ci sono molte opzioni là fuori per farlo facilmente: Meta Box, WP Alchemy, Advanced Custom Fields, ecc.
helgatheviking

@helgatheviking Grazie per i suggerimenti! Esaminerò queste opzioni ( Meta Box , WP Alchemy e Advanced Custom Fields ); quelli sono davvero belli! Onestamente, sono per lo più curioso di sapere come farlo senza utilizzare un plug-in in quanto sto cercando di rimanere minimo ed evitare di utilizzare un plug-in per ogni problema che devo risolvere (so quanto velocemente i plug-in possono accumularsi se uno (cioè, io ) non è attento). : D
mhulse,

Cosa certa. Puoi creare metabox senza plug-in (molti esempi qui, il Codex o semplicemente googling). ma a volte i plugin possono fare esattamente ciò di cui hai bisogno o rendere la tua vita molto più semplice.
helgatheviking

@helgatheviking Grazie! Ottimo consiglio! Potrei finire per usare un plugin lungo la strada a seconda di quante altre modifiche ai meta box devo fare per questo progetto. Grazie ancora per l'aiuto / link / consigli, lo apprezzo molto!
mhulse,

Cordiali saluti, per chiunque altro nella mia stessa barca: WP Alchemy sembra bello puramente dal punto di vista del fatto che è stato progettato per i programmatori; dei tre sopra elencati, penso che WP Alchemy sia il migliore per questo motivo. Anche gli altri sembrano davvero fantastici, ma preferisco stare il più vicino possibile al codice. Qualcosa da notare, tuttavia, non sono sicuro che WP Alchemy o gli altri possano aggiungere opzioni predefinite all'elenco a discesa dei campi personalizzati delle azioni. Se
finisco per usarne

Risposte:


4

Non puoi farlo con PHP puro, perché i campi vengono recuperati dai campi esistenti e non esiste un hook. Ma puoi usare JavaScript, controllare se il tipo di post supporta campi personalizzati e il campo non esiste già - e inserirlo:

<?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
}

Whoa, fantastico! Provando ora, grazie! (+1) Tornerò a contrassegnare come risposta una volta testato. Solo per curiosità, qual è il significato dietro # -*- coding: utf-8 -*-? Quello stile di commento significa qualcosa di speciale per WordPress? Grazie!!!! :)
mhulse,

@MickyHulse # -*- coding: utf-8 -*-è un cookie di codifica , aiuta gli editor a rilevare la codifica dei file. Vim, Scite e alcuni altri editor lo leggeranno. Parte del mio modello PHP standard.
fuxia

Funziona perfettamente! Ho aggiornato il mio post con alcune modifiche che ho apportato al tuo codice (ho dovuto creare il <select>se non esistesse già). Mille grazie per l'aiuto, lo apprezzo davvero !!!!!
mhulse,

... e grazie per le informazioni sul cookie di codifica , non l'avevo mai visto prima. Molto apprezzato.
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');

Aggiungi semplicemente il codice sopra in qualsiasi punto del tuo function.php. Dopo aver aggiunto il codice sopra, aggiungerebbe "www.cyberxoft.com" al menu a discesa come un'opzione da selezionare.

Se riesci a vederlo, sostituisci semplicemente "www.cyberxoft.com" con il nome del tuo campo richiesto e aggiorna la pagina di amministrazione e quando vedi ciò che succede basta andare avanti e aggiungere quanti ne vuoi MA ricordati che solo 30 potrebbero essere visto che è il limite predefinito impostato per esso.

Godere...


1

Di seguito è riportata una versione modificata del fantastico script pubblicato da @toscho. Avevo solo bisogno della possibilità di creare il <select>se non esistesse già.

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

Sono sicuro che i miei adattamenti JS potrebbero essere migliorati, ma fa il lavoro. Pubblicherò il codice aggiornato qui se apporterò modifiche / miglioramenti.

Grazie ancora @toscho !!!! Ti devo un favore. :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.