web-dev-qa-db-ja.com

フィルターフックを2回使用すると空白に戻る

これはかなり長い質問です。

ユーザーが新しいメタボックスを簡単に作成できるようにするために書いたプラグインでは、追加されるメタフィールドの種類に適したHTMLを返すためにswitch()を使用する関数があります。関数は次のようになります。

// displays the requested field type
function ecpt_render_field($field, $meta) {

    global $wp_version, $post, $ecpt_options;

    switch($field['type']) :

        case 'text' :
            $field_html = '<input type="text" name="' . $field['id'] . '" id="' . $field['id'] . '" value="' . stripslashes($meta) . '" size="30" style="width:97%" /><br/>' . __(stripslashes($field['desc']));
            break;

            /*****************************************************************
            * lots of case statements here have been removed for this example
            ******************************************************************/

    case 'checkbox' :
        $field_html = '<input type="checkbox" name="' . $field['id'] . '" id="' . $field['id'] . '" ' . checked(!empty($meta), true, false) .'/><div class="ecpt_description">' . __(stripslashes($field['desc'])) . '</div>';
        break;      

    endswitch;  

    if(has_filter('ecpt_fields_html')) {
        // this adds any addon fields (from plugins) to the array
        $field_html = apply_filters('ecpt_fields_html', $field, $field_html, $meta);
    }   

    // return the final field
    return $field_html;
}

$ fieldはフィールドのすべての情報(id、type、classなど)を含む配列です。 $ metaは、投稿メタに格納されている値です。

関数の最後に、 "ecpt_fields_html"フィルタの存在を確認するためのものがあります。これは私が他のプラグインを介して追加のメタフィールドタイプを登録できるようにするために私が設定したフィルタです。

追加のフィールドタイプを(正常に)登録する関数の例は、次のようになります。

// generates the HTML for the additional fields
function ecpt_bonus_fields_html($field, $field_html, $meta) {

    switch($field['type']) :

        case 'taxonomy' :
            // returns the options html for select fields
            $field_options = ecpt_get_field_options($field, $meta);
            $field_html =  '<select name="' . $field['id'] . '" id="' . $field['id'] . '">' . $field_options . '</select><br/>' . $field['desc'];
            break;

        case 'separator' :
            $field_html = '<hr/>';
            break;          

        case 'colorpicker' :
            if (empty($meta)) $meta = '#';
            $field_html = "<input class='ecpt-color' type='text' name='" . $field['id'] . "' id='" . $field['id'] . "' value='" . $meta . "' size='8' />
                    <a href='#' class='ecpt-color-select' rel='" . $field['id'] . "'>" . __('Select a color') . "</a>
                    <a href='#' class='ecpt-color-select' style='display: none;'>" . __('Hide Picker') . "</a>
                    <div style='display:none; position: absolute; background: #f0f0f0; border: 1px solid #ccc; z-index: 100;' class='ecpt-color-picker' rel='" . $field['id'] . "'></div>";
            break;

        default :
            $field_html = $field_html;

    endswitch;

    return $field_html;
}
add_filter('ecpt_fields_html', 'ecpt_bonus_fields_html', 10, 3);

追加のフィールドタイプを登録するこの関数は、最初のものとまったく同じように機能します。

それでは、アドオンプラグインで上記の関数を有効にして(すべてうまくいく)、次に、より多くのフィールドタイプを登録する2番目の関数を持つ2番目のプラグインを設定します(この新しい2番目の関数はまったく同じ構造です)。上記のフィルタ機能)。これを行うと、新しいフィールドタイプを登録する両方のフィルタ関数が完全に失敗します。エラーは発生しませんが、「return $ field_html;」となります。 statementは単に何も返しません。

2番目のフィルタ関数は次のようになります。

// generates the HTML for the additional fields
function ecpt_sample_fields_html($field, $field_html, $meta) {

    switch($field['type']) :

        case 'textblock' :
            $field_html = 'this should be shown in the metabox, but is not';
        break;          

    endswitch;

    return $field_html;
}
add_filter('ecpt_fields_html', 'ecpt_sample_fields_html', 10, 3);

両方のフィルタ関数は、もう一方がアクティブでないときは完全に機能しますが、両方がアクティブである場合は、$ field_html = apply_filters( 'ecpt_fields_html'、$ field、$ field_html、$ meta);最初の関数では何も起こらず、ただ空白になります。

さて、今はそれが少し見知らぬ人を得るところです。メタボックス内のフィールドタイプのラベルを表示する、ほぼ同じ機能/フィルタ設定のセットがあります。彼らは完全にうまくいきます。

コアプラグインでは、各フィールドのラベルを設定する関数は次のようになります。

// run the label through a filter. This allows us to modify/remove the label for any field type
function ecpt_field_label($field) {
    $label = '<label for="' . $field['id'] . '">' . __(stripslashes($field['name'])) . '</label>';
    // the ecpt_field_label_filter allows the field label output to be altered for any field type
    if(has_filter('ecpt_field_label_filter')) {
        $label = apply_filters('ecpt_field_label_filter', $label, $field);
    }
    return $label;
}

そして、他のプラグインに登録されたフィールドのためにラベルHTMLを変更することを可能にするフィルタ機能はこのように見えます:

// modify the labels for the bonus fields (if needed)
function ecpt_bonus_fields_labels($label, $field) {

    if($field['type'] == 'separator') {
        // removes the label for the separator field
        return;
    }
    if($field['type'] == 'header') {
        return '<h4>' . $label . '</h4>';
    }
    return $label;
}
add_filter('ecpt_field_label_filter', 'ecpt_bonus_fields_labels', 10, 2);

2番目のラベルフィルタ関数を設定したときでも、これは完全にうまく機能します(フィールドタイプに2番目の関数を設定することはそれを壊したことを覚えておいてください)。ラベルに対する私の2番目のフィルタ関数は次のようになります。

// modify the labels for the bonus fields (if needed)
function ecpt_sample_field_labels($label, $field) {

    if($field['type'] == 'textblock') {
        return '<strong>' . $label . '</strong>';
    }
    return $label;
}
add_filter('ecpt_field_label_filter', 'ecpt_sample_field_labels', 10, 2);

のみの違い(switch()とi()ステートメントの使用は別として)は、フィルタタイプfilterに3つのパラメータがあり、フィールドラベルfilterに2があることです。少なくともそれが私が見つけることができる唯一の違いです。

以下は問題を説明するスクリーンショットです。

Only the first filter function is active, used to register the Color field

Both filter functions are active. The field labels work, but not the input fields

2
Pippin

apply_filtersには

  • フックの名前である最初の引数
  • 変更する値となる2番目の引数
  • (オプション)フィルタに渡される後続の引数。

コーデックスを参照してください

0
Stephen Harris