web-dev-qa-db-ja.com

クイック編集モードでのカスタムフィールドの値の取得

クイック編集にフィールドを追加しようとしています。どういうわけかそれは動作します:それは表示され、あなたが入力フィールドに値を入力すると、値はカスタムフィールドに保存されます。しかし、カスタムフィールドの値を取得する方法を見つけることができないようです。これが私がこれまでに得たものです:

add_action('quick_edit_custom_box', 'ilc_quickedit_show', 10, 2);
function ilc_quickedit_show( $col, $type ) {
    if( $type != 'event' ) return; ?>

    <fieldset class="inline-edit-col-left">
        <div class="inline-edit-col">
            <div class="inline-edit-group">
                <label for="eventdate" style="font: italic 12px Georgia, serif;">Event Date</label>
                <span class="input-text-wrap">
                    <input type="text" name="eventdate" id="eventdate" size="10" value="">
                </span>
            </div>
        </div>
    </fieldset>

    <?php
}

入力された値は以下を使用して保存されます。

add_action('save_post','ilc_quickedit_save',10,3);
function ilc_quickedit_save($post_id, $post) {
    if( $post->post_type != 'event' ) return;
    update_post_meta($post_id, 'Event Date', $_POST['eventdate']);
}

お気づきのとおり、これはカスタム投稿タイプ「イベント」用です。ただし、値を取得してフィールドに入力することはできません。残念ながら、これにはinline-edit-post.jsが含まれますが、inlineEditPostを使用してカスタムフィールド値を取得する方法が見つかりません。投稿IDでもJavaScriptスコープで利用可能です

add_action('admin_head-edit.php', 'ilc_quickedit_get');
function ilc_quickedit_get() { ?>
    <script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery('a.editinline').live('click', function() {
            var id = inlineEditPost.getId(this);
            alert("Post id: " + id);
        });
    });
    </script>
    <?php
}

カスタムフィールドテンプレートプラグインをダウンロードしてコードを詳細に調べたところ、それらがinlineEditPost関数の一部を再定義していることがわかったので、同じことをすることを考えました。しかし、それらは、複製が格納されているオプション配列を通してそれをしているように見えます。これを解決した場合、各カスタムフィールドの値を取得するために使用しているものを共有できますか?

3
Elliot

わかりました、私はそれを手に入れました、これはコードです:

function ilc_quickedit_save($post_id, $post) {
    if( $post->post_type != 'evento' ) return;
    if (isset($_POST['is_quickedit']))
        update_post_meta($post_id, 'eventdate', $_POST['eventdate']);
}

function ilc_quickedit_get() { 
    $html = '<script type="text/javascript">';
    $html .= 'jQuery(document).ready(function() {';
        $html .= 'jQuery("a.editinline").live("click", function() {';

        $html .= 'var id = inlineEditPost.getId(this);';
        $html .= 'jQuery.post("' . THEME_URI . '/library/admin/admin.php",{ post_id: id, modo: "ajaxget" },';
        $html .= 'function(data){ jQuery("#eventdate").val(data); }';

    $html .= ');});});';
    $html .= '</script>';
    echo $html;
}

そして、admin.phpファイルの先頭のコード(このコードがすべて配置されているのと同じファイルです)。

if($_POST['modo'] == 'ajaxget'){
    require_once('../../../../../wp-blog-header.php');
    $post_id = $_POST['post_id'];
    echo get_post_meta($post_id, 'eventdate', true);
    return;
}

これまでのところ非常に良いことですが、他にも方法があります。一括編集モードで保存しておく必要があります。そこでも手を使うことができます:)これが誰かに役立つことを願っています。

2
Elliot

これはテストされていないコードです。それがあなたのために働くかどうか確かめてください。基本的に、以下で読むように、私は$postをグローバル化し、あなたのCPTをチェックし、そして投稿のメタからカスタムフィールドeventを検索します(最後のパラメータの "true"で設定された単一の値を返します)。

あなたがしなければならない唯一のことはあなたのjQueryの中で$eventを参照することです:その値をjavascriptに出力するために{$event}。それは「静的」に見えますが、実際には動的です。

add_action('admin_head-edit.php', 'ilc_quickedit_get');

function ilc_quickedit_get()
{
    global $post;

    if ( $post->post_type != "event" )
        return;

    $event = get_post_meta( $post->ID, 'event', true ); // gets a *single* option from the postmeta table

$html = <<<HTML
<script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery('a.editinline').live('click', function() {
            // do something with {$event}
        });
    });
</script>
HTML;

    echo $html;
}

PS読みやすくするため、jQueryで$eventをすばやく参照できるように、HTMLコードをPHP変数に割り当てました。 。

0
Zack