เพิ่มตัวเลือกโดยทางโปรแกรมเพื่อ "เพิ่มใหม่" ฟิลด์แบบเลื่อนลง


10

ฉันจะเพิ่มตัวเลือกที่กำหนดไว้ล่วงหน้าลงในดร็อปดาวน์ฟิลด์ที่กำหนดเอง "เพิ่มใหม่" ได้อย่างไร

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือสองตัวอย่างของการเพิ่มและแสดงฟิลด์ที่กำหนดเองใหม่โดยอัตโนมัติ:

  1. WordPress: การเพิ่มฟิลด์ที่กำหนดเองเริ่มต้นในกระทู้ใหม่
  2. สร้างฟิลด์ที่กำหนดเองอัตโนมัติ

นั่นใกล้เคียงกับสิ่งที่ฉันต้องการจะทำ; เป้าหมายของฉันคือการเพิ่มตัวเลือกที่กำหนดไว้ล่วงหน้าลงในดรอปดาวน์ "เพิ่มใหม่" ที่กำหนดเอง แต่ไม่ได้แสดงเป็นฟิลด์จนกว่า Blogger จะเพิ่มพวกเขา

ฉันต้องการทราบวิธีการทำเช่นนี้โดยไม่ต้องใช้ปลั๊กอิน


หากคุณต้องการกรอกฟิลด์ที่เฉพาะเจาะจงทำไมไม่ใช้เมท็อกซ์ที่กำหนดเอง มีตัวเลือกมากมายให้ทำเช่นนี้ได้อย่างง่ายดาย: Meta Box, WP Alchemy, ฟิลด์ Custom Custom และอื่น ๆ
helgatheviking

@helgatheviking ขอบคุณสำหรับเคล็ดลับ! ฉันจะตรวจสอบตัวเลือกเหล่านั้น ( Meta Box , WP Alchemyและฟิลด์กำหนดเองขั้นสูง ); ดูดีจริงๆ! สุจริตฉันส่วนใหญ่อยากรู้วิธีการทำเช่นนี้โดยไม่ต้องใช้ปลั๊กอินในขณะที่ฉันพยายามที่จะอยู่น้อยและหลีกเลี่ยงการใช้ปลั๊กอินสำหรับทุกปัญหาที่ฉันต้องแก้ปัญหา (ฉันรู้ว่าปลั๊กอินรวดเร็วสามารถสร้างขึ้นได้อย่างไร ) ไม่ระวัง) : D
mhulse

แน่นอนค่ะ คุณสามารถสร้าง metaboxes โดยไม่ต้องใช้ปลั๊กอิน (มีตัวอย่างมากมายที่นี่ Codex หรือเพียงแค่ทำด้วย googling) แต่บางครั้งปลั๊กอินสามารถทำสิ่งที่คุณต้องการหรือทำให้ชีวิตของคุณง่ายขึ้นมาก
helgatheviking

@helgatheviking ขอบคุณ! คำแนะนำที่ดี! ฉันอาจใช้ปลั๊กอินตามถนนขึ้นอยู่กับว่าต้องปรับแต่ง meta box มากแค่ไหนสำหรับโครงการนี้ ขอบคุณอีกครั้งสำหรับความช่วยเหลือ / ลิงค์ / คำแนะนำฉันขอขอบคุณจริงๆ!
mhulse

FYI สำหรับคนอื่นในเรือลำเดียวกันกับฉัน: WP Alchemy ดูดีมากจากจุดยืนที่ทำเพื่อโปรแกรมเมอร์ จากสามข้อที่กล่าวมาข้างต้นฉันคิดว่าฉันชอบ WP Alchemy ดีที่สุดเพราะเหตุนั้น คนอื่นก็ดูเท่ห์เหมือนกัน แต่ฉันชอบที่จะอยู่ใกล้กับรหัสมากที่สุด สิ่งที่ควรทราบฉันไม่แน่ใจว่า WP Alchemy หรืออื่น ๆ สามารถเพิ่มตัวเลือกเริ่มต้นลงในฟิลด์ดร็อปดาวน์แบบกำหนดเอง ถ้าฉันลงเอยด้วยการใช้อย่างใดอย่างหนึ่งหรือทั้งหมดฉันจะโพสต์กลับมาที่นี่พร้อมกับการยืนยัน (หรือถ้าใครสามารถยืนยันได้ว่าจะเจ๋ง!)
mhulse

คำตอบ:


4

คุณไม่สามารถทำเช่นนั้นได้ด้วย PHP ล้วนเพราะเขตข้อมูลถูกดึงข้อมูลจากเขตข้อมูลที่มีอยู่และไม่มีการขอ แต่คุณสามารถใช้ JavaScript ตรวจสอบว่าประเภทการโพสต์สนับสนุนฟิลด์ที่กำหนดเองและฟิลด์นั้นไม่มีอยู่แล้ว - และใส่:

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

โอ้โหสุดยอด! ลองตอนนี้ขอบคุณ! (+1) ฉันจะกลับมาเพื่อทำเครื่องหมายว่าเป็นคำตอบเมื่อทดสอบแล้ว เพิ่งออกมาจากความอยากรู้ความหมายที่อยู่เบื้องหลัง# -*- coding: utf-8 -*-คืออะไร? สไตล์ความคิดเห็นนั้นมีความหมายอะไรกับ WordPress เป็นพิเศษหรือไม่? ขอบคุณ!!!! :)
mhulse

@MickyHulse # -*- coding: utf-8 -*-เป็นคุกกี้เข้ารหัสซึ่งช่วยให้ผู้ตรวจจับตรวจจับการเข้ารหัสไฟล์ เป็นกลุ่ม, Scite และบรรณาธิการอื่น ๆ จะอ่านมัน เป็นส่วนหนึ่งของเทมเพลต PHP มาตรฐานของฉัน
fuxia

ทำงานได้อย่างสมบูรณ์แบบ! ฉันได้อัปเดตโพสต์ของฉันด้วยการปรับแต่งที่ฉันทำกับรหัสของคุณ (ฉันต้องสร้าง<select>ถ้ายังไม่มีอยู่) ขอบคุณมากสำหรับความช่วยเหลือฉันซาบซึ้งจริงๆ !!!!!
mhulse

... และขอบคุณสำหรับข้อมูลเกี่ยวกับคุกกี้การเข้ารหัสฉันไม่เคยเห็นมาก่อน ชื่นชมมาก
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');

เพียงเพิ่มโค้ดด้านบนที่ใดก็ได้ในธีมของคุณ function.php หลังจากที่คุณเพิ่มรหัสข้างต้นแล้วมันจะเพิ่ม 'www.cyberxoft.com' ลงในรายการแบบหล่นลงซึ่งเป็นหนึ่งในตัวเลือกที่จะเลือก

ถ้าคุณเห็นมันก็แค่แทนที่ 'www.cyberxoft.com' ด้วยชื่อฟิลด์ที่คุณต้องการและรีเฟรชหน้าผู้ดูแลระบบและเมื่อคุณเห็นว่ามันเกิดขึ้นเพียงไปข้างหน้าและเพิ่มมากเท่าที่คุณชอบ แต่จำไว้ว่าเพียง 30 อาจเป็น ดูเป็น thats ขีด จำกัด เริ่มต้นที่กำหนดไว้สำหรับมัน

สนุก...


1

ด้านล่างนี้เป็นรุ่นที่แก้ไขของน่ากลัวสคริปต์โพสต์โดย @toscho ฉันแค่ต้องการความสามารถในการสร้าง<select>ถ้ามันไม่มีอยู่จริง

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

ฉันแน่ใจว่าการดัดแปลง JS ของฉันอาจได้รับการปรับปรุง แต่ก็ทำงานได้สำเร็จ ฉันจะโพสต์โค้ดอัปเดตที่นี่ถ้าฉันทำการเปลี่ยนแปลง / ปรับปรุง

ขอบคุณอีกครั้ง @toscho !!!! ฉันเป็นหนี้คุณ :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.