Programowo dodawaj opcje do rozwijanego menu „dodaj nowe”

10

Jak mogę dodać wstępnie zdefiniowane opcje do listy rozwijanej „Dodaj nowe” pole niestandardowe?

wprowadź opis zdjęcia tutaj

Oto dwa przykłady automatycznego dodawania i pokazywania nowych pól niestandardowych:

  1. WordPress: Dodawanie domyślnych niestandardowych pól do nowych postów
  2. Automatyczne tworzenie niestandardowego pola

To blisko tego, co chcę zrobić; moim celem jest dodanie predefiniowanych opcji do rozwijanego menu „Dodaj nowe” niestandardowe pole, ale nie wyświetlanie ich jako pól, dopóki blogger ich nie doda.

Chciałbym wiedzieć, jak to zrobić bez użycia wtyczki.

mhulse
źródło
Jeśli chcesz wypełnić określone pola, skorzystaj z niestandardowego metaboksu? Istnieje wiele opcji, aby to zrobić łatwo: Meta Box, WP Alchemy, Advanced Custom Fields itp.
helgatheviking
@helgatheviking Dzięki za wskazówki! Sprawdzę te opcje ( Meta Box , WP Alchemy i Advanced Custom Fields ); te wyglądają naprawdę ładnie! Szczerze mówiąc, jestem głównie ciekawy, jak to zrobić bez użycia wtyczki, ponieważ staram się pozostać minimalnym i unikać używania wtyczki do każdego problemu, który muszę rozwiązać (wiem, jak szybko można zbudować wtyczki, jeśli jeden (tj. Ja ) nie jest ostrożny). : D
mhulse
Jasne. Możesz tworzyć metaboksy bez wtyczek (mnóstwo przykładów tutaj, Codex lub po prostu przez Google). ale czasem wtyczki mogą zrobić dokładnie to, czego potrzebujesz lub znacznie uprościć Ci życie.
helgatheviking
@helgatheviking Thanks! Dobra rada! Mogę skończyć z użyciem wtyczki w dół drogi, w zależności od tego, o ile więcej poprawek w meta-boxie muszę zrobić dla tego projektu. Jeszcze raz dziękuję za pomoc / linki / porady, naprawdę to doceniam!
mhulse
Do Twojej wiadomości wszystkim, którzy są na tej samej łodzi co ja: WP Alchemy wygląda ładnie z punktu widzenia programistów; spośród trzech wymienionych powyżej myślę, że z tego powodu najbardziej lubię WP Alchemy. Inne też wyglądają naprawdę fajnie, ale wolę być jak najbliżej kodu. Warto jednak zauważyć, że nie jestem pewien, czy WP Alchemy, lub inni, mogą dodać domyślne opcje do rozwijanego menu niestandardowego pola. Jeśli w końcu użyję jednego lub wszystkich, wyślę tutaj z potwierdzeniem (lub, jeśli ktokolwiek może to potwierdzić, byłoby fajnie!)
mhulse

Odpowiedzi:

4

Nie można tego zrobić z czystym PHP, ponieważ pola są pobierane z istniejących pól i nie ma żadnego haka. Ale możesz użyć JavaScript, sprawdź, czy typ wpisu obsługuje pola niestandardowe i pole jeszcze nie istnieje - i wstaw go:

<?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
źródło
Łał, super! Próbuję teraz, dziękuję! (+1) Po przetestowaniu wrócę do zaznaczenia jako odpowiedzi. Właśnie z ciekawości, jakie jest znaczenie tego # -*- coding: utf-8 -*-? Czy ten styl komentarzy oznacza coś specjalnego dla WordPress? Dziękuję Ci!!!! :)
mhulse
@MickyHulse # -*- coding: utf-8 -*-to ciasteczko kodujące , które pomaga redaktorom w wykrywaniu kodowania plików. Vim, Scite i niektórzy inni redaktorzy to przeczytają. Część mojego standardowego szablonu PHP.
fuxia
Działa świetnie! Zaktualizowałem mój post za pomocą kilku poprawek, które wprowadziłem do twojego kodu (musiałem stworzyć, <select>jeśli jeszcze nie istniał). Wielkie dzięki za pomoc, naprawdę to doceniam !!!!!
mhulse
... i dzięki za informacje na temat kodującego pliku cookie , nie widziałem tego wcześniej. Bardzo mile widziane.
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');

Po prostu dodaj powyższy kod w dowolnym miejscu w pliku theme.php. Po dodaniu powyższego kodu doda on „www.cyberxoft.com” do listy rozwijanej jako jedną z opcji do wyboru.

Jeśli to zobaczysz, po prostu zastąp „www.cyberxoft.com” wymaganą nazwą pola i odśwież stronę administratora, a kiedy zobaczysz, że tak się stało, po prostu dodaj tyle, ile chcesz, ale pamiętaj, że tylko 30 może być postrzegane jako domyślny ustawiony limit.

Cieszyć się...

CyberXoft
źródło
1

Poniżej znajduje się zmodyfikowana wersja niesamowitego skryptu opublikowanego przez @toscho. Potrzebowałem tylko możliwości stworzenia, <select>jeśli jeszcze nie istnieje.

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

Jestem pewien, że moje adaptacje JS mogłyby zostać ulepszone, ale wykonują to zadanie. Prześlę tutaj zaktualizowany kod, jeśli wprowadzę zmiany / ulepszenia.

Jeszcze raz dziękuję @toscho !!!! Jestem ci winny przysluge. :)

mhulse
źródło