web-dev-qa-db-ja.com

ギャラリー設定利用可能な列を変更する

ギャラリー設定画面で利用可能な列の数を変更するフィルタフックがありますか。私は話しています:

<label class="setting">
    <span><?php _e('Columns'); ?></span>
    <select class="columns" name="columns"
        data-setting="columns">
        <?php for ( $i = 1; $i <= 9; $i++ ) : ?>
            <option value="<?php echo esc_attr( $i ); ?>" <?php selected( $i, 3 ); ?>>
                <?php echo esc_html( $i ); ?>
            </option>
        <?php endfor; ?>
    </select>
</label>

wp-includes/media-template.php行に359-369Wordpress v3.5

私が基本的にやりたいことは、ループ終了条件で$i <= 9;$i <= 5;に変更することです。

そうすれば、次回のWordpressの更新で破棄されるでしょう。

ご協力いただきありがとうございます

ユージーン

3
eugene.kud

短い答え

物事として単純なことがあります:いいえこれは不可能です。全体がハードコードされています。

長い答え(そうすることはお勧めできません)

esc_htmlattribute_escapeフィルタに飛び込んでそこに空を返すだけでもいいかもしれませんが*)、これらはかなり一般的な名前であり、他のフィルタの結果に干渉して他のものを壊す可能性があります。

<?php
/* Plugin Name: (#82379) Empty Media options */
add_filter( 'image_size_names_choose', 'wpse82379_esc_attr' );
function wpse82379_trigger_filter( $sizes )
{
    if ( 'post' !== get_current_screen()->post )
        return $safe_text;

    add_filter( 'attribute_escape', 'wpse82379_esc_attr', 10, 2 );
    add_filter( 'esc_html', 'wpse82379_esc_attr', 10, 2 );

    return $sizes;
}
function wpse82379_esc_attr( $safe_text, $text )
{
    if ( ! in_array( absint( $text ), range( 6, 9 ) ) )
        return $safe_text;

    static $counter = 0;
    $static++;

    // 
    if ( 1 === $static )
    {
        ob_start();
        return $safe_text;
    }
    if ( in_array( $static, array( 7, 9 ) ) )
    {
        remove_filter( current_filter(), __FUNCTION__ );
        if ( 'esc_html' === current_filter() )
        {
            $html = ob_get_contents();
            ob_end_clean();
            // In case you want to alter the layout, rework $html and return it
            return '';
        }
    }

    return $safe_text;
}

エスケープフィルタはほぼどこにでも存在するので、本番環境でそれらを使用することは実際には推奨されません(gettext-filtersのように)。それらはすべてのエスケープ(ページごとに数百)にトリガし、本当にあなたのシステムを遅くすることができます。

内部とパフォーマンス

これを回避するために、HTMLスクリプトの出力の前に最後に実行されるフィルタを使用して、できるだけ遅くコールバックを追加しました。それから私はポスト "add new"スクリーン以外のどのページでもこのプラグインフィルターを引き起こさないようにできるだけ頻繁に打ち切ります。 HTMLのソースファイルをチェックした後、バージョン3.5ではesc_attr_e()(これは内部的にesc_attrそしてそのために私達のフィルタを起動する)に対する呼び出しは2回しかないのですが、2つの文字列があるので、安全に中止できます。私たちが最終的に私たちのフィルタに到達したとき、私は空の文字列を返し、そしてそれ以降の呼び出しのためにトリガしないように即座にフィルタを取り除きます。

これはあなたが達成できる最高のものです。

編集

それを考えた後、私はobキャッシングを使いました - きれいではありませんが、うまくいくはずです(間違っていない限り)。注:これは記述および思考中にコーディングされるため、テストされていません。うまくいくかどうかを確認する必要があります。

最後の注意:マークアップが変更されていないこと、そしてそれがまだ期待通りに動作していることを確認するために、(WP v3.6で始まる)以降の各バージョンの後にこのプラグインを再チェックする必要があります。

*)これで空の文字列が残るでしょう。言い換えれば、それらはまだ存在しますが、機能しておらず、空です(文字列なし)。

0
kaiser

フィルタフックはあってもなくてもかまいませんが、スタイルを使用してギャラリー設定画面で使用可能な列の数を制限することができます - 特に管理CSS.

1〜5列を選択するには、これをWordPress管理者スタイルシートに追加します。 (作成する必要があるかもしれません。)

スタイル

.gallery-settings .columns option:nth-child(n+6) {
    display: none;
    }

関数

あなたのエンキューPHPファイルで wp_enqueue_style を使ってこれを引き込むようにWordPressに伝えてください。

function wp_admin_styles() {
    wp_enqueue_style('admin-styles', get_template_directory_uri().'/wordpress-admin.css');
}
add_action('admin_enqueue_scripts', 'wp_admin_styles');

enter image description here

ノート

<select><option>タグがない場合は選択できません。*上記の例では、6番目の子から始まるすべてのオプションが対象となります。これは.gallery-settingsクラス内の.columnsクラスのみに制限されるので、他の管理者選択オプションで問題を起こさないと言っても差し支えありません。

私のプロジェクトでは、nth-child(9)を使って9番目のオプションのみをターゲットにしました。これは、 Zurb Foundationのblock-grid を1〜8列の選択肢で使用しているためです。 9を選択すると、レイアウトが崩れます。

これがスタイルシートにあるので、更新後に何かを失うことを心配する必要はありません。


*選択肢は限られますが、ユーザーはテキストエディタオプションを使用して列番号を設定できる可能性があることに注意してください。 [gallery columns="9" ids="113,107,92,57,45,44"]しかしもしあなたが賢いのであれば、とにかくユーザーのためにおそらくテキストエディタオプションをオフにしたでしょう。

1
nic