Fügen Sie programmgesteuert Optionen hinzu, um ein neues benutzerdefiniertes Feld-Dropdown-Menü hinzuzufügen

10

Wie kann ich vordefinierte Optionen zum Dropdown-Menü "Neues hinzufügen" hinzufügen?

Geben Sie hier die Bildbeschreibung ein

Hier sind zwei Beispiele für das automatische Hinzufügen und Anzeigen neuer benutzerdefinierter Felder:

  1. WordPress: Hinzufügen von benutzerdefinierten Standardfeldern zu neuen Posts
  2. Benutzerdefiniertes Feld automatisch erstellen

Das kommt dem nahe, was ich tun möchte. Mein Ziel ist es, vordefinierte Optionen zum Dropdown-Menü "Neu hinzufügen" hinzuzufügen, diese jedoch erst dann als Felder anzuzeigen, wenn der Blogger sie hinzufügt.

Ich würde gerne wissen, wie das geht, ohne ein Plugin zu verwenden.

mhulse
quelle
Wenn Sie bestimmte Felder ausfüllen müssen, können Sie eine benutzerdefinierte Metabox verwenden. Es gibt viele Möglichkeiten, dies einfach zu tun: Meta Box, WP Alchemy, Advanced Custom Fields usw.
Helgatheviking
@helgatheviking Danke für die Tipps! Ich werde diese Optionen überprüfen ( Meta Box , WP Alchemy und Advanced Custom Fields ). die sehen wirklich gut aus! Ehrlich gesagt bin ich meistens neugierig, wie man dies ohne Verwendung eines Plugins macht, da ich versuche, minimal zu bleiben und die Verwendung eines Plugins für jedes Problem zu vermeiden, das ich lösen muss (ich weiß, wie schnell sich Plugins aufbauen können, wenn eines (dh ich) ) ist nicht vorsichtig). : D
mhulse
Sichere Sache. Sie können Metaboxen ohne Plugins erstellen (viele Beispiele hier, im Codex oder einfach durch Googeln). Aber manchmal können Plugins genau das tun, was Sie brauchen, oder Ihr Leben viel einfacher machen.
Helgatheviking
@helgatheviking Danke! Guter Rat! Ich werde möglicherweise später ein Plugin verwenden, je nachdem, wie viel mehr Meta-Box-Optimierungen ich für dieses Projekt vornehmen muss. Nochmals vielen Dank für die Hilfe / Links / Ratschläge, ich schätze es sehr!
Mhulse
Zu Ihrer Information, für alle anderen im selben Boot wie ich: WP Alchemy sieht rein von dem Standpunkt aus gut aus, dass es für Programmierer gemacht ist; Von den drei oben aufgeführten denke ich, dass ich WP Alchemy aus diesem Grund am besten mag. Die anderen sehen auch sehr cool aus, aber ich bleibe lieber so nah wie möglich am Code. Ich bin mir jedoch nicht sicher, ob WP Alchemy oder die anderen Standardoptionen zum benutzerdefinierten Dropdown-Feld für Aktien hinzufügen können. Wenn ich am Ende einen oder alle benutze, werde ich hier mit Bestätigung zurückschicken (oder, wenn jemand anderes bestätigen kann, wäre das cool!)
mhulse

Antworten:

4

Sie können dies nicht mit reinem PHP tun, da die Felder aus vorhandenen Feldern abgerufen werden und es keinen Hook gibt. Sie können jedoch JavaScript verwenden, prüfen, ob der Beitragstyp benutzerdefinierte Felder unterstützt und das Feld noch nicht vorhanden ist, und es einfügen:

<?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
quelle
Whoa, großartig! Ich versuche es jetzt, danke! (+1) Ich werde zurück sein, um nach dem Test als Antwort zu markieren. Was bedeutet dahinter nur aus Neugier # -*- coding: utf-8 -*-? Bedeutet dieser Kommentarstil etwas Besonderes für WordPress? Vielen Dank!!!! :)
mhulse
@MickyHulse # -*- coding: utf-8 -*-ist ein Codierungscookie , mit dem Redakteure die Dateicodierung erkennen können. Vim, Scite und einige andere Redakteure werden es lesen. Teil meiner Standard-PHP-Vorlage.
Fuxia
Funktioniert perfekt! Ich habe meinen Beitrag mit einigen Änderungen an Ihrem Code aktualisiert (ich musste den erstellen, <select>falls er noch nicht vorhanden war). Vielen Dank für die Hilfe, ich weiß das wirklich zu schätzen !!!!!
Mhulse
... und danke für die Infos zum Kodierungscookie , das hatte ich noch nie gesehen. Sehr geschätzt.
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');

Fügen Sie einfach den obigen Code an einer beliebigen Stelle in Ihrer Themes function.php hinzu. Nachdem Sie den obigen Code hinzugefügt haben, wird "www.cyberxoft.com" als Dropdown-Option zur Dropdown-Liste hinzugefügt.

Wenn Sie es sehen, ersetzen Sie einfach 'www.cyberxoft.com' durch Ihren gewünschten Feldnamen und aktualisieren Sie die Administrationsseite. Wenn Sie sehen, dass dies passiert ist, fügen Sie einfach so viele hinzu, wie Sie möchten, ABER denken Sie daran, dass nur 30 sein könnten Dies ist das Standardlimit, das dafür festgelegt wurde.

Genießen...

CyberXoft
quelle
1

Unten finden Sie eine modifizierte Version des fantastischen Skripts von @toscho. Ich brauchte nur die Fähigkeit, das zu erstellen, <select>wenn es nicht schon existierte.

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

Ich bin sicher, dass meine JS-Anpassungen verbessert werden könnten, aber es erledigt den Job. Ich werde hier aktualisierten Code veröffentlichen, wenn ich Änderungen / Verbesserungen vornehme.

Nochmals vielen Dank @toscho !!!! Ich schulde dir etwas. :) :)

mhulse
quelle