프로그래밍 방식으로 옵션을 추가하여 "새로 추가"사용자 정의 필드 드롭 다운


10

"새로 추가"사용자 정의 필드 드롭 다운에 사전 정의 된 옵션을 추가하려면 어떻게해야합니까?

여기에 이미지 설명을 입력하십시오

다음은 새 사용자 정의 필드를 자동으로 추가하고 표시하는 두 가지 예입니다.

  1. 워드 프레스 : 새 게시물에 기본 사용자 정의 필드 추가
  2. 맞춤 입력란 자동 생성

그것은 내가하고 싶은 것에 가깝습니다. 내 목표는 미리 정의 된 옵션을 "새로 추가"사용자 지정 파일 드롭 다운에 추가하는 것이지만 블로거가 추가 할 때까지 필드로 표시하지 않도록하는 것입니다.

플러그인을 사용하지 않고이를 수행하는 방법을 알고 싶습니다.


특정 입력란을 작성해야하는 경우 맞춤 메타 박스를 사용하지 않는 이유는 무엇입니까? Meta Box, WP Alchemy, Advanced Custom Fields 등
Helgatheviking

@helgatheviking 팁 주셔서 감사합니다! 이러한 옵션 ( Meta Box , WP AlchemyAdvanced Custom Fields )을 확인하겠습니다 . 정말 멋져요! 솔직히, 나는 최소한으로 머물려고 노력하고 해결해야 할 모든 문제에 대해 플러그인을 사용하지 않기 때문에 플러그인을 사용하지 않고이 작업을 수행하는 방법에 대해 대부분 궁금합니다. )는주의하지 않습니다). : D
mhulse

확실한 것. 플러그인없이 메타 박스를 만들 수 있습니다 (여기에서 Codex 또는 인터넷 검색으로 많은 예). 그러나 때때로 플러그인은 필요한 것을 정확하게 수행하거나 인생을 훨씬 간단하게 만들 수 있습니다.
helgatheviking

@helgatheviking 감사합니다! 좋은 충고! 이 프로젝트에서 얼마나 많은 메타 박스를 수정해야하는지에 따라 플러그인을 사용하게 될 수도 있습니다. 도움말 / 링크 / 조언에 다시 한번 감사드립니다. 정말 감사합니다!
mhulse

참고로, 나와 같은 배에있는 다른 사람에게 : 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 -*-인코딩 쿠키로 편집기에서 파일 인코딩을 감지하는 데 도움이됩니다. Vim, Scite 및 다른 편집자들이 읽을 것입니다. 표준 PHP 템플릿의 일부입니다.
fuxia

완벽하게 작동합니다! 나는 당신의 코드에 대한 약간의 조정으로 내 게시물을 업데이트 <select>했습니다 (아직 존재하지 않는다면 if 를 만들어야 했습니다). 도움을 주셔서 감사합니다. 정말 감사합니다 !!!!!
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'을 필요한 필드 이름으로 바꾸고 관리자 페이지를 새로 고치십시오. 그런 일이 발생하면 원하는만큼 추가하십시오. 기본 제한 설정으로 간주됩니다.

즐겨...


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.