Có thể lập trình thêm các tùy chọn để thêm vào


10

Làm cách nào tôi có thể thêm các tùy chọn được xác định trước vào danh sách thả xuống trường tùy chỉnh "thêm mới"?

nhập mô tả hình ảnh ở đây

Đây là hai ví dụ về tự động thêm và hiển thị các trường tùy chỉnh mới:

  1. WordPress: Thêm trường tùy chỉnh mặc định trên bài viết mới
  2. Tự động tạo trường tùy chỉnh

Điều đó gần với những gì tôi muốn làm; Mục tiêu của tôi là thêm các tùy chọn được xác định trước vào danh sách thả xuống tùy chỉnh "thêm mới", nhưng không hiển thị chúng dưới dạng các trường cho đến khi blogger thêm chúng.

Tôi muốn biết làm thế nào để làm điều này mà không cần sử dụng một plugin.


Nếu bạn cần điền vào các trường cụ thể, tại sao không sử dụng metabox tùy chỉnh? Có rất nhiều tùy chọn ngoài kia để thực hiện điều này một cách dễ dàng: Meta Box, WP Alchemy, Advanced Custom Field, v.v.
helgatheviking

@helgatheviking Cảm ơn lời khuyên! Tôi sẽ kiểm tra các lựa chọn ( Meta Box , WP Alchemy , và nâng cao Tuỳ Fields ); Chúng trông thật đẹp! Thành thật mà nói, tôi rất tò mò làm thế nào để làm điều này mà không cần sử dụng một plugin vì tôi đang cố gắng duy trì tối thiểu và tránh sử dụng một plugin cho mọi vấn đề mà tôi cần giải quyết (tôi biết các plugin có thể xây dựng nhanh như thế nào nếu một ( ) không cẩn thận). : D
mhulse

Điều chắc chắn. Bạn có thể tạo metabox mà không cần plugin (rất nhiều ví dụ ở đây, Codex hoặc chỉ bằng cách googling). nhưng đôi khi các plugin có thể làm chính xác những gì bạn cần hoặc làm cho cuộc sống của bạn đơn giản hơn rất nhiều.
xe đạp

@rcgeveviking Cảm ơn! Lời khuyên tuyệt vời! Tôi có thể kết thúc bằng cách sử dụng một plugin xuống đường tùy thuộc vào số lượng chỉnh sửa hộp meta tôi cần thực hiện cho dự án này. Cảm ơn một lần nữa vì sự giúp đỡ / liên kết / lời khuyên, tôi thực sự đánh giá cao nó!
mhulse

FYI, với bất kỳ ai khác trong cùng một chiếc thuyền như tôi: WP Alchemy trông đẹp hoàn toàn từ quan điểm mà nó được tạo ra cho các lập trình viên; Trong số ba danh sách trên, tôi nghĩ tôi thích WP Alchemy nhất vì lý do đó. Những cái khác trông cũng rất tuyệt, nhưng tôi thích ở gần mã nhất có thể. Mặc dù vậy, có một điều cần lưu ý, tôi không chắc liệu WP Alchemy hay những người khác có thể thêm các tùy chọn mặc định vào danh sách trường tùy chỉnh chứng khoán hay không. Nếu tôi kết thúc bằng một hoặc tất cả, tôi sẽ đăng lại ở đây với xác nhận (hoặc, nếu có ai có thể xác nhận, điều đó sẽ rất tuyệt!)
mhulse

Câu trả lời:


4

Bạn không thể làm điều đó với PHP thuần túy, bởi vì các trường được tìm nạp từ các trường hiện có và không có hook. Nhưng bạn có thể sử dụng JavaScript, kiểm tra xem loại bài đăng có hỗ trợ các trường tùy chỉnh không và trường này chưa tồn tại - và chèn nó:

<?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, tuyệt vời! Cố gắng bây giờ, cảm ơn bạn! (+1) Tôi sẽ quay lại đánh dấu là câu trả lời sau khi được kiểm tra. Vì tò mò, ý nghĩa đằng sau là # -*- coding: utf-8 -*-gì? Phong cách bình luận đó có ý nghĩa gì đặc biệt với WordPress không? Cảm ơn bạn!!!! :)
mhulse

@MickyHulse # -*- coding: utf-8 -*-là một cookie mã hóa , nó giúp các biên tập viên phát hiện mã hóa tập tin. Vim, Scite và một số biên tập viên khác sẽ đọc nó. Một phần của mẫu PHP tiêu chuẩn của tôi.
fuxia

Hoạt động hoàn hảo! Tôi đã cập nhật bài đăng của mình với một số điều chỉnh mà tôi đã thực hiện đối với mã của bạn (tôi phải tạo <select>nếu nó chưa tồn tại). Rất cám ơn sự giúp đỡ, tôi thực sự đánh giá cao nó !!!!!
mhulse

... và cảm ơn về thông tin trên cookie mã hóa , tôi chưa từng thấy điều đó trước đây. Nhiều đánh giá cao.
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');

Chỉ cần thêm mã ở trên bất cứ nơi nào trong chủ đề function.php của bạn. Sau khi bạn đã thêm mã ở trên, nó sẽ thêm 'www.cyberxoft.com' vào trình đơn thả xuống dưới dạng một trong các tùy chọn để chọn.

Nếu bạn có thể thấy nó, thì chỉ cần thay thế 'www.cyberxoft.com' bằng tên trường bắt buộc của bạn và làm mới trang quản trị và khi bạn thấy điều đó xảy ra, hãy tiếp tục và thêm bao nhiêu tùy thích NHƯNG hãy nhớ rằng chỉ có 30 xem như đó là giới hạn mặc định được đặt cho nó.

Thưởng thức...


1

Dưới đây là phiên bản sửa đổi của tập lệnh tuyệt vời được đăng bởi @toscho. Tôi chỉ cần khả năng tạo <select>nếu nó chưa tồn tại.

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

Tôi chắc chắn rằng các điều chỉnh JS của tôi có thể được cải thiện, nhưng nó hoàn thành công việc. Tôi sẽ đăng mã cập nhật trở lại đây nếu tôi thực hiện thay đổi / cải tiến.

Cảm ơn một lần nữa @toscho !!!! Tôi nợ bạn một cái. :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.