it-swarm.com.de

Programmgesteuertes Hinzufügen von Optionen zum Hinzufügen eines neuen benutzerdefinierten Felds

Wie kann ich der Dropdown-Liste "Neues" benutzerdefiniertes Feld vordefinierte Optionen hinzufügen?

enter image description here

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

  1. WordPress: Hinzufügen von benutzerdefinierten Standardfeldern für neue Beiträge
  2. Benutzerdefiniertes Feld automatisch erstellen

Das entspricht ungefähr dem, was ich tun möchte. Mein Ziel ist es, vordefinierte Optionen zur Dropdown-Liste "Neue 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.

10
mhulse

Mit reinem PHP ist dies nicht möglich, da die Felder aus vorhandenen Feldern abgerufen werden und es keinen Hook gibt. Sie können jedoch JavaScript verwenden. Überprüfen Sie, ob der Beitragstyp benutzerdefinierte Felder unterstützt und das Feld noch nicht vorhanden ist, und fügen Sie es ein:

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

Fügen Sie den obigen Code einfach an einer beliebigen Stelle in Ihrer theme function.php ein. Nachdem Sie den obigen Code hinzugefügt haben, wird der Dropdown-Liste "www.cyberxoft.com" als eine der auswählbaren Optionen hinzugefügt.

Wenn Sie es sehen, ersetzen Sie einfach "www.cyberxoft.com" durch Ihren erforderlichen 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 wird als Standardlimit angesehen.

Genießen...

2
CyberXoft

Unten ist eine modifizierte Version des awesome Skripts von @toscho. Ich brauchte nur die Möglichkeit, den <select> zu erstellen, falls er noch nicht existiert.

/**
 * 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 wird die Arbeit erledigt. Ich werde den aktualisierten Code hier veröffentlichen, wenn ich Änderungen/Verbesserungen vornehme.

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

1
mhulse