OnePressのコード研究ー1.sectionの順序

OnePressのカスタマイズについて、トップページに表示されるセクションの順序を変更する方法を以前紹介しました。

OnePressのカスタマイズ-1. セクションの順序の入れ替え

この方法は、template-frontpage.php内にある「onepress_frontpage_sections_order」というフィルターフックを利用しています。

function my_onepress_frontpage_sections_order() {
      $mysections = array('gallery', 'features', 'about', 'services', 'videolightbox', 'counter', 'team', 'news', 'contact');
      return $mysections;
    }
add_filter('onepress_frontpage_sections_order', 'my_onepress_frontpage_sections_order');

ところで、このフィルターフックをかけると、同時に表示順が変更される部分が2か所あります。一つは、右サイドに表示されているセクション・ナビゲーション(ドット・ナビゲーション)、もう一つは管理画面内のOnePressテーマのダッシュボードです。
それに対して、テーマカスタマイザー画面では、セクションの順序は変更されません。

これは何故なのか、探ってみたいと思います。

1.セクション・ナビゲーションの表示順

セクション・ナビゲーション(右サイドのドット)の設定に関するコードはonepress/inc/class-sections-navigation.phpにあります。そのなかに以下のような記述があります。

function get_sections() {
    /**
   * @since 2.1.1
   */
  $new = Onepress_Config::get_sections();

  // Filter to add more custom sections here
  return apply_filters( 'onepress_sections_navigation_get_sections', $new );
}

ここで「onepress_sections_navigation_get_sections」へのフィルターフックを利用するという手もありそうですが、今回はそこは触っていませんから、「Onepress_Config::get_sections()」という関数に要因がありそうです。

onepress/inc/class-config.phpを見ると、次のような部分がありますね。

class Onepress_Config {
  /**
   * Get sections
   *
   * @return array
   */
  static function get_sections(){

    $sorted_sections = apply_filters( 'onepress_frontpage_sections_order', array(
      'features', 'about', 'services', 'videolightbox', 'gallery', 'counter', 'team',  'news', 'contact'
    ) );

    $sections_config = array(
      'hero' => array(
        'label' => __( 'Section: Hero', 'onepress' ),
        'title' => __( 'Home', 'onepress' ),
        'default' => false,
        'inverse' => false,
      ),
      
   (略)
    );

    $new = array(
      'hero' => $sections_config['hero']
    );

    foreach ( $sorted_sections as $id ) {
      if ( isset( $sections_config[ $id ] ) ) {
        $new[ $id ] = $sections_config[ $id ];
      }
    }

    // Filter to add more custom sections here
    return apply_filters( 'onepress_get_sections', $new );

  }
}

この関数内に「onepress_frontpage_sections_order」というフィルターが用意されています。これがトップページの表示順を決めるものと同一ですから、ここにもフックがかかることになるのです。

2.OnePressのダッシュボード

onepress/inc/admin/dashboad.phpを見てみましょう。

function sections_settings(){
      $sections = Onepress_Config::get_sections();

  (略)
    }

「Onepress_Config::get_sections()」を使ってセクション設定を呼び出しているので、ここにもフックがかかることになります。

3.テーマカスタマイザー画面

onepress/inc/customizer.php内を調べてみます。

function onepress_customize_register( $wp_customize ) {

 (略)
  /**
   * @since 2.1.1
   * Load sections if enabled
   */
  $sections = Onepress_Config::get_sections();

  foreach( $sections as $key => $section ) {
    if ( Onepress_Config::is_section_active( $key ) ) {
      $file = $path. '/inc/customize-configs/section-'.$key.'.php';
      if ( file_exists( $file ) ) {
        require_once $file;
      }
    }
  }
(略)
}
add_action( 'customize_register', 'onepress_customize_register' );

各セクションは「Onepress_Config::get_sections()」で呼び出されていますが、そこから読み込まれている各セクションの設定ファイル内には「priority」が設定されています。それによって表示順が決定されているのです。

たとえば、onepress/inc/customize-config/section-about.phpでは以下のようになっています。

$wp_customize->add_panel( 'onepress_about',
  array(
    'priority'        => 160,
    'title'           => esc_html__( 'Section: About', 'onepress' ),
    'description'     => '',
    'active_callback' => 'onepress_showon_frontpage'
  )
);

priorityは「160」に設定されていますね。

ここが、section-features.phpだと「150」、section-news.phpだと「260」などと設定されており、この数値の大小によって表示順が決定されていることが分かります。