kompass/buena/src/Pfadfinden/WordPress/BuenaTheme.php

318 lines
8.7 KiB
PHP
Raw Normal View History

2023-12-30 14:28:21 +01:00
<?php
namespace Pfadfinden\WordPress;
use Shy\WordPress\Theme;
class BuenaTheme extends Theme
{
/**
* @var BuenaSettings
*/
protected $settings;
public function getContentWidth()
{
return 684;
}
public function __construct()
{
parent::__construct();
$this->settings = new BuenaSettings();
$this->addHookMethod( 'after_setup_theme', 'afterSetupTheme' );
$this->addHookMethod( 'wp_enqueue_scripts', 'enqueueScriptsStyles' );
$this->addHookMethod( 'buena_search_form', 'printSearchForm' );
$this->addHookMethod( 'admin_init', 'initAdministration' );
$this->addHookMethod( 'mce_css', 'filterEditorStylesheets' );
$this->addHookMethod( 'wp_page_menu', 'filterPageMenu' );
$this->addHookMethod( 'widgets_init', 'registerSidebars' );
$this->addHookMethod( 'the_content', 'filterContent' );
$this->addHookMethod( 'image_size_names_choose', 'filterImageSizeNames' );
$this->addHookMethod( 'media_upload_tabs', 'filterMediaTabs' );
$this->addHookMethod( 'media_view_settings', 'filterMediaViewSettings' );
$this->addHookMethod( 'media_view_strings', 'filterMediaViewSettings' );
$this->addHookMethod( 'print_media_templates', 'printMediaTemplates' );
}
public function afterSetupTheme()
{
add_theme_support( 'title-tag' );
add_theme_support( 'automatic-feed-links' );
register_nav_menu( 'primary', __( 'Hauptmenü', 'buena-theme' ) );
register_nav_menu( 'footer', __( 'Fußzeile', 'buena-theme' ) );
add_theme_support( 'html5', [
'comment-list', 'comment-form', 'search-form', 'gallery', 'caption',
] );
add_theme_support( 'post-thumbnails' );
$custom_header = [
'width' => apply_filters( 'buena_header_image_width', 1300 ),
'height' => apply_filters( 'buena_header_image_height', 635 ),
'flex-width' => true,
'flex-height' => true,
'default-image' => get_template_directory_uri() . '/img/leitbild_aktionen_low.jpg',
'uploads' => true,
'header-text' => false,
];
add_theme_support( 'custom-header', $custom_header );
set_post_thumbnail_size( $custom_header['width'], $custom_header['height'], true );
add_image_size( 'gallery-thumb', 350, 165, true );
register_default_headers( [
'aktionen' => [
'url' => '%s/img/leitbild_aktionen_low.jpg',
'thumbnail_url' => '%s/img/leitbild_aktionen_low_klein.jpg',
'description' => __( 'Leitbild Aktionen', 'buena-theme' ),
],
'bund' => [
'url' => '%s/img/leitbild_bund_crop.jpg',
'thumbnail_url' => '%s/img/leitbild_bund_crop_klein.jpg',
'description' => __( 'Leitbild Bund', 'buena-theme' ),
],
'ihs' => [
'url' => '%s/img/leitbild_ihs.jpg',
'thumbnail_url' => '%s/img/leitbild_ihs_klein.jpg',
'description' => __( 'Leitbild Immenhausen', 'buena-theme' ),
],
'international' => [
'url' => '%s/img/leitbild_int2_low.jpg',
'thumbnail_url' => '%s/img/leitbild_int2_low_klein.jpg',
'description' => __( 'Leitbild International', 'buena-theme' ),
],
'kontakt' => [
'url' => '%s/img/leitbild_Kontakt_low.jpg',
'thumbnail_url' => '%s/img/leitbild_Kontakt_low_klein.jpg',
'description' => __( 'Leitbild Kontakt', 'buena-theme' ),
],
'pfadfinden' => [
'url' => '%s/img/leitbild_pfadfinden_low.jpg',
'thumbnail_url' => '%s/img/leitbild_pfadfinden_low_klein.jpg',
'description' => __( 'Leitbild Pfadfinden', 'buena-theme' ),
],
] );
}
public function getTeaserImage()
{
if ( is_page() || have_posts() && is_single() ) { // FIXME: is_singular()?
the_post();
$thumb = get_the_post_thumbnail( null, 'post-thumbnail', [ 'alt' => '' ] );
rewind_posts();
if ( $thumb ) {
return $thumb;
}
}
if ( is_home() || $this->settings['always_show_poster'] ) {
return sprintf(
'<img src="%s" height="%d" width="%d" alt="" />',
get_header_image(),
get_custom_header()->height,
get_custom_header()->width
);
}
return '';
}
/**
* Gibt einen Titel für die aktuelle Seite aus.
*/
public function printTitle()
{
if ( is_singular() ) {
the_title();
} elseif ( is_category() && strpos( $_SERVER['HTTP_HOST'], 'abendlager.pfadfinden.de' ) !== false ) {
// FIXME: Workaround mit 1.0 entfernen.
single_cat_title( '', true );
} elseif ( is_archive() ) {
the_archive_title();
} elseif ( is_search() ) {
esc_html_e( sprintf(
__( 'Suche nach „%s“', 'buena-theme' ),
get_search_query( false )
) );
} else {
bloginfo( 'description' );
}
}
public function enqueueScriptsStyles()
{
wp_enqueue_style( 'immenhausen-font', get_template_directory_uri() . '/font/ihs.css' );
wp_enqueue_style( 'buena-style', get_stylesheet_uri() );
}
/**
* Gibt das Suchformular aus. Nötig, damit im Kopf anderer Code stehen kann als anderswo.
*/
public function printSearchForm()
{
get_search_form( true );
}
/**
* Tut, was dransteht.
*/
public function registerSidebars()
{
register_sidebar( [
'id' => 'below-navigation',
'name' => __( 'Unter Navigation', 'buena-theme' ),
'description' => __( 'Ziemlich schmal.', 'buena-theme' ),
'before_title' => '<h4 class="h-widget">',
'after_title' => '</h4>',
] );
register_sidebar( [
'id' => 'footer',
'name' => __( 'Fußleiste', 'buena-theme' ),
'description' => __( 'Rechte Spalte des Briefumschlags. Recht flach. Füllt die ganze Breite aus, wenn kein Navigationsmenü zugewiesen ist.', 'buena-theme' ),
'before_title' => '<h4 class="h-widget">',
'after_title' => '</h4>',
] );
}
/**
* Ausgabe von wp_page_menu() filtern, dass sie wie wp_nav_menu() aussieht.
*
* @param string $menu
* @param array $args
* @return string
*/
public function filterPageMenu( $menu, array $args )
{
if ( ! isset( $args['fallback_cb'] ) || $args['fallback_cb'] !== 'wp_page_menu' ) {
return $menu;
}
$vorher = '<div class="' . esc_attr( $args['menu_class'] ) . '">';
$danach = '<' . $args['container'];
if ( $args['container_class'] ) {
// In diesem Fall doch optional…
$danach .= ' class="' . esc_attr( $args['container_class'] ) . '"';
}
if ( $args['container_id'] ) {
$danach .= ' id="' . esc_attr( $args['container_id'] ) . '"';
}
$danach .= '>';
if ( strpos( $menu, '<ul>' ) !== false ) {
// Wenn das Menü leer ist, enthält es den <ul>-Teil nicht.
$vorher .= '<ul>';
$danach .= '<ul class="' . esc_attr( $args['menu_class'] ) . '">';
}
$menu = str_replace( $vorher, $danach, $menu );
$menu = substr( $menu, 0, -5 ) . $args['container'] . ">\n";
$menu = str_replace( "class='children'", 'class="sub-menu"', $menu );
$menu = str_replace( 'current_page_item', 'current_page_item current-menu-item', $menu );
$menu = str_replace( 'current_page_ancestor', 'current_page_ancestor current-menu-ancestor', $menu );
return $menu;
}
/**
* Zusatzfunktionen für das Backend laden.
*/
public function initAdministration()
{
if ( isset( $_GET['exp'] ) && class_exists( 'Pfadfinden\WordPress\BuenaSettingsPage' ) ) {
new BuenaSettingsPage( $this->settings );
}
add_editor_style();
}
/**
* Standard-Skin des Editors rauswerfen.
*
* @param string $stylesheets
* @return string
*/
public function filterEditorStylesheets( $stylesheets )
{
$stylesheets = explode( ',', $stylesheets );
$stylesheets = array_filter( $stylesheets, function ( $url ) {
return strpos( $url, 'tinymce' ) === false;
} );
return implode( ',', $stylesheets );
}
/**
* Überschriften <h1> und <h2> durch <h3> ersetzen.
*
* @param string $content
* @return string
*/
public function filterContent( $content )
{
$content = preg_replace( '/\\<h[12]([^>]*)>(.*?)\\<\\/h[12]>/', '<h3$1>$2</h3>', $content );
return $content;
}
/**
* @param array $names
* @return array
*/
public function filterImageSizeNames( array $names )
{
return $names;
}
/**
* @param array $tabs
* @return array
*/
public function filterMediaTabs( $tabs )
{
return $tabs;
return $tabs + [
'insert-poster' => __( 'Posterbilder', 'buena-theme' ),
];
// Erzeugt einen <iframe> von wp-admin/media-upload.php?chromeless=1&post_id=123456&tab=insert-poster
}
public function filterMediaViewSettings( $settings )
{
//var_dump( $settings );
return $settings;
}
/**
* Weitere Templates für Medienbrowser ausgeben.
*/
public function printMediaTemplates()
{
global $_wp_default_headers;
?>
<script type="text/html" id="tmpl-insert-poster">
<ul>
<?php foreach ( $_wp_default_headers as $k => $header ) : ?>
<img alt="<?php esc_attr_e( $header['description'] ); ?>" src="<?php echo esc_url( sprintf( $header['thumbnail_url'], get_template_directory_uri() ) ); ?>" />
<?php endforeach; ?>
</ul>
</script>
<?php
}
}