サポート » 使い方全般 » ギャラリー作成時のデフォルト値を変更したい

  • ギャラリーを作成時のデフォルト値を変更したいと思っています。
    具体的にはカラムを3列から2列に変更したいです。

    毎回、ギャラリー作成時に指示をすればカラム数は変えられますが、作業の間違えを少なくするために、一番良く使う2列の設定を初期値にしたいと思っていますが、そもそも初期値を変えられるのかどうかも分かりません。

    勉強も兼ねて、何かヒントをご教授していただければ幸いです。
    どうぞよろしくお願いいたします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • モデレーター jim912

    (@jim912)

    結構難度が高いかもしれません。

    WordPress 3.5 でメディアのリンク先から添付ファイルのページの選択肢を消去する

    と同様の方法で、参考記事は特定のソースを削除していますが、これを置換処理して、2の時に、selected になるようにすれば、デフォルト値を変えられるはずです。

    トピック投稿者 atorinco

    (@atorinco)

    jim912さま、ありがとうございます。
    残念ながら全然理解できませんでした。

    何とかフックをするんだろうな・・・レベルのかじり掛け初心者で、
    今までは困ったことがあると、検索してコードをコピペして凌いでいました。
    今回は自分で解決してみたいと思い、思い切って質問させていただきました。

    一歩でも前に進めたらと、
    分かるところからやってみたことをご報告いたします。


    wp-includes/media.phpにあるGallery shortcodeの
    ‘columns’ => 3,
    を2に書き換えたいと思い、functions.phpに以下を記入しました。

    add_shortcode('gallery', 'my_gallery_shortcode');
    function my_gallery_shortcode($attr) {
    ~~~
    
    	extract(shortcode_atts(array(
    		'order'      => 'ASC',
    		'orderby'    => 'menu_order ID',
    		'id'         => $post->ID,
    		'itemtag'    => 'dl',
    		'icontag'    => 'dt',
    		'captiontag' => 'dd',
    		'columns'    => 2,
    		'size'       => 'thumbnail',
    		'include'    => '',
    		'exclude'    => ''
    	), $attr));
    
    ~~~~
    }

    出力結果は2列になったようですが
    問題は、管理画面の表示が3列のままでした。


    HTML出力の記述を探しましたら
    media-template.phpの359行あたりにcolumnsのセレクト値が3の指示があったので

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

    これを2に置き換えようと思いましたが
    functions.phpにどう書いていいのやらわかりませんでした。
    とりあえず一時的にコアファイルを書き換えてみましたら
    ギャラリー作成の管理画面表示も2列になりデフォルト値が変わったように思えます。

    コアファイルは触らずに、この部分を変更する方法があるのでしょうか。
    アクションフックとフィルターフックとは何か?
    どこでどう使えるのか?
    使えないところはどういう時か?という基本的なことが解らずにいます。

    jim912さまにいただいたヒントとは、かけ離れたことをやっているように思いますが、
    もう少しヒントをいただけたらと思います
    よろしくお願いいたします。

    モデレーター jim912

    (@jim912)

    理解しようとすることはすばらしいことなので、是非続けてください。

    アクションフックとフィルターフックですが、Web Design Recipes さんの記事「WordPressをカスタマイズするなら覚えておきたいアクションフックとフィルターフック」が丁寧に説明されているので、紹介しておきます。

    簡単にいうと、アクションフックは、WordPress の処理が行われる特定のイベント時に、独自の処理を行えるようにするもの
    フィルターフックは、WordPress のオリジナルデータを独自データに改変できるものです。
    最大の違いは、アクションフックは独自処理を挟むだけなので、データをWordPress に返す必要がないこと。実際のアクションフックを動かすところも

    do_action( 'init' );

    のようになっています。
    それに対してフィルターフックは、オリジナルのデータを改変するものなので、改変したデータをWordPressに返して(return)してあげなければなりません。フィルターフックを行う箇所のコードは、

    $content = apply_filters('the_content', $content);

    となっており、フィルターフックを通ったデータを変数に代入したりするようになっています。

    今回の件ですが、お伝えしたヒントが、②の書き換えの方法になります。

    参考記事のコードは、画像を記事に挿入する際の「リンク先」のプルダウンメニューから「添付ファイルのページ」を削除するコードとなります。実際に適用してみて確認してみてください。
    WordPress オリジナルのコードを改変するので、フィルターフックを用いて改変したいところなのですが、ここの部分は関数から直接HTML出力が行われてしまうため、フィルターフックを使うことができません。

    このため、該当部分を出力している前後のアクションフックを使い、

    ・前のアクションフックにおいて、HTML出力を止めて、バッファリング(メモリ上への一時保存)を開始

    function media_script_buffer_start() {
        ob_start();
    }
    add_action( 'post-upload-ui', 'media_script_buffer_start' );

    ・後のアクションフックで、バッファの内容(HTMLのコード)を変数に取得して、変えたい部分のコードを改変
    ・改変したHTMLのコードを出力

    function media_script_buffer_get() {
        $scripts = ob_get_clean();
        $scripts = preg_replace( '#<option value="post">.*?</option>#s', '', $scripts );
        echo $scripts;
    }
    add_action( 'print_media_templates', 'media_script_buffer_get' );

    としています。

    ギャラリーの列数についても、参考で紹介しているものの、バッファリング範囲に入っています。

    つまり、基本的にはほぼそのままで、取得したHTMLを改変している部分

    $scripts = preg_replace( '#<option value="post">.*?</option>#s', '', $scripts );

    をギャラリーの列数を選択している部分が変わるように書き換えればよいのです。

    トピック投稿者 atorinco

    (@atorinco)

    jim912さま、丁寧な説明ありがとうございます。
    フックについて、ぼんやりしていたところが少しわかったような気がしました。
    が実際にやってみたところ、思うように行きませんでした。

    まず、$patternできちんと検索しているか確認した後、$repacmentに書き換えたいコードをそのまま入れてみました。

    function media_script_buffer_start() {
        ob_start();
    }
    add_action( 'post-upload-ui', 'media_script_buffer_start' );
    function media_script_buffer_get() {
        $scripts = ob_get_clean();// 対象文字列
        $pattern ='#<select class="columns" name="columns" data-setting="columns">.*?</select>#s';// パターン
        $replacement = '<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, 2); ?>>
        		<?php echo esc_html( $i ); ?>
        	</option>
        <?php endfor; ?>
        </select>' ;// 置換後の文字列
        $scripts = preg_replace( $pattern, $replacement, $scripts );// 置換
        echo $scripts;//出力
    }
    add_action( 'print_media_templates', 'media_script_buffer_get' );

    html出力結果は、
    ギャラリー編集画面、カラムの値は「>」
    ページのソースを表示してみましたら<?php ~ ?>の行はPHPコードではなく、文字列になっていました。

    <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, 2); ?>>
    			<?php echo esc_html( $i ); ?>
    		</option>
    	<?php endfor; ?>
    </select>

    Firebugで見るとコメントアウトされています。
    <!--?php for ( $i = 1; $i <= 9; $i++ ) : ?-->

    文字列ではなくPHPコードとして実行するには?、正規表現?、eオプションなど、闇雲に試し過ぎて何がなんだか解らなくなっています。
    少し頭を冷やして、時間をかけて解決したいと思います。
    PHPの勉強からやり直したいと思います。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「ギャラリー作成時のデフォルト値を変更したい」には新たに返信することはできません。