+ protected function render() {}
+
+ /**
+ * Render the panel UI in a subclass.
+ *
+ * Panel contents are now rendered in JS by default, see WP_Customize_Panel::print_template().
+ *
+ * @since 4.1.0
+ * @access protected
+ */
+ protected function render_content() {}
+
+ /**
+ * Render the panel's JS templates.
+ *
+ * This function is only run for panel types that have been registered with
+ * WP_Customize_Manager::register_panel_type().
+ *
+ * @since 4.3.0
+ *
+ * @see WP_Customize_Manager::register_panel_type()
+ */
+ public function print_template() {
+ ?>
+ <script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>-content">
+ <?php $this->content_template(); ?>
+ </script>
+ <script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>">
+ <?php $this->render_template(); ?>
+ </script>
+ <?php
+ }
+
+ /**
+ * An Underscore (JS) template for rendering this panel's container.
+ *
+ * Class variables for this panel class are available in the `data` JS object;
+ * export custom variables by overriding WP_Customize_Panel::json().
+ *
+ * @see WP_Customize_Panel::print_template()
+ *
+ * @since 4.3.0
+ * @access protected
+ */
+ protected function render_template() {