プログラムで「新しい」カスタムフィールドドロップダウンを追加するオプションを追加する


10

「新規追加」カスタムフィールドドロップダウンに定義済みオプションを追加するにはどうすればよいですか?

ここに画像の説明を入力してください

新しいカスタムフィールドを自動的に追加して表示する2つの例を次に示します。

  1. WordPress:新しい投稿にデフォルトのカスタムフィールドを追加する
  2. カスタムフィールドを自動作成

それは私がやりたいことに近いです。私の目標は、事前定義されたオプションを「新規追加」カスタムフィールドドロップダウンに追加することですが、ブロガーが追加するまでフィールドとして表示されません。

プラグインを使用せずにこれを行う方法を知りたいのですが。


特定のフィールドに入力する必要がある場合は、カスタムメタボックスを使用してみませんか?これを簡単に行うためのオプションはたくさんあります:Meta Box、WP Alchemy、Advanced Custom Fieldsなど
helgatheviking 2013年

@helgathevikingヒントをありがとう!これらのオプション(メタボックスWPアルケミー、および高度なカスタムフィールド)を確認します。それらは本当に素敵に見えます!正直なところ、私はプラグインを使用せずにこれを行う方法にほとんど興味があります。解決する必要があるすべての問題に対してプラグインを最小限に抑え、プラグインを使用しないようにしているためです(プラグインがどれだけ高速に構築できるかを知っています(つまり、私)は注意してください)。:D
mhulse 2013年

確実なこと。プラグインなしでメタボックスを作成することができます(ここ、Codex、またはグーグルで多くの例を示します)。しかし、プラグインは、必要なものを正確に実行したり、人生をはるかに簡単にしたりできることがあります。
helgatheviking 2013

@helgathevikingありがとうございます!素晴らしいアドバイス!このプロジェクトでメタボックスをさらに微調整する必要があるかどうかに応じて、プラグインが使用される可能性があります。ヘルプ/リンク/アドバイスをありがとう、本当に感謝しています!
mhulse 2013年

参考までに、私と同じボートに乗っている他の人にとって:WP Alchemyは、プログラマー向けに作られたという観点からは、純粋に見栄えが良いです。上記の3つのうち、私はWP Alchemyが一番いい理由だと思います。他の人も本当にかっこいいように見えますが、私はできるだけコードに近づくことを好みます。ただし、WP Alchemyやその他のユーザーがデフォルトのオプションをストックカスタムフィールドのドロップダウンに追加できるかどうかはわかりません。最終的に1つまたはすべてを使用する場合は、ここに確認の
メッセージを

回答:


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 2013年

@MickyHulse # -*- coding: utf-8 -*-エンコーディングCookieであり、編集者がファイルのエンコーディングを検出するのに役立ちます。Vim、Scite、その他の一部の編集者がそれを読みます。標準のPHPテンプレートの一部。
fuxia

完璧に動作します!私はあなたのコードに加えたいくつかの微調整で私の投稿を更新しました(<select>まだ存在しない場合は作成する必要がありました)。助けてくれてありがとう、本当に感謝しています!!!!!
mhulse 2013年

...そして、エンコーディングCookieに関する情報をありがとう、私はこれまで見たことがない。大変感謝いたします。
mhulse 2013年

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のどこかに追加するだけです。上記のコードを追加すると、選択オプションの1つとして「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.