Compare commits

...

2 Commits

Author SHA1 Message Date
b5112ab12e Basic release 2023-12-30 14:32:43 +01:00
bf2892ab29 Basic release 2023-12-30 14:28:21 +01:00
125 changed files with 10730 additions and 0 deletions

52
assets/calendar.css Normal file
View File

@ -0,0 +1,52 @@
.bdp_cal_outer {
background-color: #ffffff;
width: 85%;
margin: auto;
padding: 10px;
border-style: solid; border-color: #d0d0d0; border-radius: 10px; padding: 15px; border-width: 1px;
box-shadow: 2px 2px 5px #c0c0c0;
}
.bdp_cal_inner {
border-style: solid; border-color: #d0d0d0; border-radius: 10px; padding: 15px; border-width: 1px;
box-shadow: 2px 2px 5px #c0c0c0;
width: 80%;
margin: 0 auto 40px;
}
.bdp_cal_inner legend {
background-color: #ffcb04;
background: linear-gradient(#ffffff 5%, #ffcb04);
color: #3163bd;
width: 150px;
padding: 5px 0 5px 25px;
font-weight: bold;
border-style: solid;
border-width: 1px;
border-color: #d0d0d0;
border-radius: 10px;
box-shadow: 2px 2px 5px #c0c0c0;
}
.bdp_cal_inner table {
width: 100%;
}
.bdp_cal_inner table tr td:first-child {
width: 100px;
font-weight: bold;
}
.bdp_cal_inner table tr td:nth-child(2) {
padding:5px 10px;
}
.bdp_cal_inner table tr td:last-child {
width: 100%;
font-weight: bold;
}
.long_text {
width: 80%;
}

View File

@ -0,0 +1,36 @@
<style>
/* Dein benutzerdefiniertes CSS hier */
body.login {
background-color: #efefef;
background-image: url(%%BDP_LV_PLUGIN_URL%%/holz.jpg);
}
#login {
width: 800px !important;
}
body.login h1 {
display: none;
}
#loginform {
width: 750px;
margin: auto;
background-color: #ffcb04;
border: 1px solid #ccc;
box-shadow: 2px 2px 5px #000000;
border-radius: 20px;
font-weight: bold;
}
#loginform #wp-submit {
background-color: #3163bd !important;
color: #ffcb04;
border-radius: 10px;
font-size: 12pt;
font-weight: bold;
box-shadow: 5px 5px 5px #a0a0a0;
}
/* Weitere benutzerdefinierte Stile hier */
</style>

55
assets/security.css Normal file
View File

@ -0,0 +1,55 @@
.bdp_security_outer {
background-color: #ffffff;
width: 85%;
margin: auto;
padding: 10px;
border-style: solid; border-color: #d0d0d0; border-radius: 10px; padding: 15px; border-width: 1px;
box-shadow: 2px 2px 5px #c0c0c0;
}
.bdp_security_inner {
border-style: solid; border-color: #d0d0d0; border-radius: 10px; padding: 15px; border-width: 1px;
box-shadow: 2px 2px 5px #c0c0c0;
width: 80%;
margin: 0 auto 40px;
}
.bdp_security_inner legend {
background-color: #ffcb04;
background: linear-gradient(#ffffff 5%, #ffcb04);
color: #3163bd;
width: 150px;
padding: 5px 0 5px 25px;
font-weight: bold;
border-style: solid;
border-width: 1px;
border-color: #d0d0d0;
border-radius: 10px;
box-shadow: 2px 2px 5px #c0c0c0;
}
.bdp_security_inner table {
width: 100%;
}
.bdp_security_inner table tr td:first-child {
width: 75px;
vertical-align: top;
font-weight: bold;
padding-top: 10px;
}
.bdp_security_inner table tr td:nth-child(2) {
vertical-align: top;
padding:5px 10px;
}
.bdp_security_inner table tr td:last-child {
font-weight: bold;
}
.long_text {
width: 80%;
}

87
assets/wordpress-bdp.css Normal file
View File

@ -0,0 +1,87 @@
#adminmenu,
#wpadminbar,
#adminmenuwrap,
#adminmenuback {
background-color: #ffcb04 !important;
}
#toplevel_page_limit-login-attempts,
#wp-admin-bar-llar-root {
display: none;
}
.wp-submenu-wrap,
.wp-submenu-head {
color: #FFFFFF !important;
}
.wp-has-submenu,
.wp-not-current-submenu,
.menu-top,
#collapse-button,
#wp-submenu ul,
#wp-admin-bar-site-name,
.ab-item
{
color: #46484d !important;
font-weight: bold !important;
}
.wp-menu-open ,
.wp-has-current-submenu li,
#adminmenu ul
{
background-color: #3163bd !important;
color: #FFFFFF !important;
}
.wp-not-current-submenu:hover,
#wpadminbar .ab-item:hover
{
background-color: #3163bd !important;
color: #FFFFFF !important;
}
.ab-submenu {
background-color: #ffcb04 !important;
}
#wp-admin-bar-updates,
#wp-admin-bar-comments,
#wp-admin-bar-new-content,
#wp-admin-bar-wp-logo
{
display: none;
}
.bdp_submit:hover {
color: #ffffff;
background-color: #3163bd;
cursor: pointer;
border-radius: 5px;
}
.bdp_submit {
background-color: #ffffff;
padding: 5px 25px;
border-style: solid;
border-width: 1px;
border-color: #769be7;
cursor: pointer;
border-radius: 5px;
box-shadow: 2px 2px 2px #d0d0d0;
}
#bdp_success {
background-color: #ffffff;
border-color: #c3c4c7;
border-left-color: #00a32a;
padding: 10px 12px;
margin: 5px 0 15px;
border-width: 1px;
border-style: solid;
border-left-width: 4px;
width: 97%;
}

202
bdp-kompass.php Normal file
View File

@ -0,0 +1,202 @@
<?php
/**
* Plugin Name: BdP Kompass
* Description: Wordpress-Plugin zur Unterstützung von Stämmen im Bund der Pfadfinderinnen und Pfadfinder e.V. zur optimalen Verwaltung eurer Webseite
* Version: 4.1.1
* Tags: bdp, utility, helper
* Requires at least: 6.0
* Requires PHP: 8.2
* Author: Thomas Günther
* Author URI: https://www.sachsen.pfadfinden.de
* Update URI: https://lv-sachsen-main.bdp.mein-verein.online/wordpress/
* Text Domain: bdp-kompass
*/
use Bdp\Modules\Security\Security;
use Bdp\Modules\Seo\Seo;
define('BDP_LV_PLUGIN_DIR', ABSPATH . '/wp-content/plugins/bdp-kompass/');
define('BDP_LV_PLUGIN_URL', plugin_dir_url(__FILE__));
define('BDP_LV_PLUGIN_SLUG', 'bdp-kompass');
require_once BDP_LV_PLUGIN_DIR . 'core/fileloader.php';
bdp_create_menu_structure();
function bdp_plugin_install() {
Seo::setup();
Calendar::setup();
Security::setup();
update_option('kompass_installation', true);
}
function bdp_plugin_init()
{
remove_menu_page('admin.php?page=limit-login-attempts&tab=dashboard');
if (get_option('kompass_installation') == true) {
delete_option('kompass_installation');
wp_redirect('admin.php?page=bdp-kompass%2Fmodules%2Findex.php&loadmodule=firstusage');
}
}
register_activation_hook(__FILE__, 'bdp_plugin_install');
add_action('init', 'bdp_plugin_init');
function register_custom_theme_directory() {
$file = ABSPATH . '/wp-content/plugins/bdp-kompass/buena/' ;
system('mkdir ' . ABSPATH . 'wp-content/themes/buena/');
system('cp -r ' . $file . '* ' . ABSPATH . 'wp-content/themes/buena/');
switch_theme('buena');
}
#add_action( 'after_setup_theme', 'register_custom_theme_directory' );
class BdpVersionChecker
{
public $plugin_slug;
public $version;
public $cache_key;
public $cache_allowed;
public $updateUrl;
public function __construct()
{
$plugin_data = get_plugin_data(__FILE__);
$this->plugin_slug = 'bdp-kompass';
$this->updateUrl = $plugin_data['UpdateURI'] . '/info.json';
$this->version = $plugin_data['Version'];
$this->cache_key = 'bdp_kompass_upd';
$this->cache_allowed = true;
add_filter('plugins_api', array($this, 'info'), 20, 3);
add_filter('site_transient_update_plugins', array($this, 'update'));
add_action('upgrader_process_complete', array($this, 'purge'), 10, 2);
}
public function request()
{
$remote = get_transient($this->cache_key);
if (false === $remote || !$this->cache_allowed) {
$remote = wp_remote_get(
$this->updateUrl
,
array(
'timeout' => 10,
'headers' => array(
'Accept' => 'application/json'
)
)
);
if (
is_wp_error($remote)
|| 200 !== wp_remote_retrieve_response_code($remote)
|| empty(wp_remote_retrieve_body($remote))
) {
return false;
}
set_transient($this->cache_key, $remote, 3600);
}
$remote = json_decode(wp_remote_retrieve_body($remote));
return $remote;
}
function info($res = '', $action = '', $args = '')
{
if (!isset($args->slug) || $args->slug !== $this->plugin_slug) {
return $res;
}
// get updates
$remote = $this->request();
if (!$remote) {
return $res;
}
$res = new stdClass();
$res->name = $remote->name;
$res->slug = $remote->slug;
$res->version = $remote->version;
$res->tested = $remote->tested;
$res->requires = $remote->requires;
$res->author = $remote->author;
$res->author_profile = $remote->author_profile;
$res->download_link = $remote->download_url;
$res->trunk = $remote->download_url;
$res->requires_php = $remote->requires_php;
$res->last_updated = $remote->last_updated;
$res->sections = array(
'description' => $remote->sections->description,
'installation' => $remote->sections->installation,
'changelog' => $remote->sections->changelog
);
if (!empty($remote->banners)) {
$res->banners = array(
'low' => $remote->banners->low,
'high' => $remote->banners->high
);
}
return $res;
}
public function update($transient)
{
if (empty($transient->checked)) {
return $transient;
}
$remote = $this->request();
if(
$remote
&& version_compare( $this->version, $remote->version, '<' )
&& version_compare( $remote->requires, get_bloginfo( 'version' ), '<=' )
&& version_compare( $remote->requires_php, PHP_VERSION, '<' )
) {
$res = new stdClass();
$res->slug = $this->plugin_slug;
$res->plugin = plugin_basename( __FILE__ );
$res->new_version = $remote->version;
$res->tested = $remote->tested;
$res->package = $remote->download_url;
$transient->response[ $res->plugin ] = $res;
} else {
$res = new stdClass();
$res->slug = $this->plugin_slug;
$res->plugin = plugin_basename( __FILE__ );
$transient->no_update[ $res->plugin ] = $res;
}
return $transient;
}
public function purge($upgrader, $options)
{
if (
$this->cache_allowed
&& 'update' === $options['action']
&& 'plugin' === $options['type']
) {
delete_transient($this->cache_key);
}
}
}
$class = new BdpVersionChecker();
add_filter( 'plugins_api', array( $class, 'info' ), 20, 3 );

96
buena/404.php Normal file
View File

@ -0,0 +1,96 @@
<!DOCTYPE html>
<!--[if IE 7]>
<html class="ie ie7" <?php language_attributes(); ?>>
<![endif]-->
<!--[if IE 8]>
<html class="ie ie8" <?php language_attributes(); ?>>
<![endif]-->
<!--[if !(IE 7) | !(IE 8) ]><!-->
<html <?php language_attributes(); ?>>
<!--<![endif]-->
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut icon" href="<?php echo esc_url( get_template_directory_uri() ); ?>/img/favicon.ico" />
<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />
<?php if ( is_singular() ) wp_enqueue_script( 'comment-reply' ); ?>
<?php wp_head(); ?>
</head>
<!-- FIXME: Mehr ARIA role setzen -->
<body <?php body_class(); ?>>
<div id="wrap"><!-- FIXME: Klassen hfeed, site? -->
<header id="header" role="banner"><!-- FIXME: Klasse site-header? -->
<hgroup id="branding">
<h1 class="site-title">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" title="<?php _e( 'Zurück zur Startseite', 'buena-theme' ); ?>">
<img alt="Bund der Pfadfinderinnen und Pfadfinder" src="<?php echo esc_url( get_template_directory_uri() ); ?>/img/bundeszeichen.png" srcset="<?php echo esc_url( get_template_directory_uri() ); ?>/img/bundeszeichen.png 1x, <?php echo esc_url( get_template_directory_uri() ); ?>/img/bundeszeichen@2x.png 2x" width="390" height="79" />
</a>
</h1>
<h2 class="site-description">
<?php echo esc_html( get_bloginfo( 'name', 'display' ) ); ?>
</h2>
</hgroup>
<nav class="screen-reader-text">
<!-- FIXME: Tollere Navigation ausdenken -->
<a href="#content">
<?php _e( 'Zum Inhalt springen', 'buena-theme' ); ?>
</a>
</nav>
<?php do_action( 'buena_search_form' ); ?>
</header>
<div id="left">
<?php wp_nav_menu( [ 'theme_location' => 'primary', 'depth' => 2, 'container' => 'nav', 'container_class' => 'nav-menu' ] ); ?>
<?php if ( is_active_sidebar( 'below-navigation' ) ): ?>
<ul class="widgets">
<?php dynamic_sidebar( 'below-navigation' ); ?>
</ul>
<?php endif; ?>
</div>
<div id="teaser">
<?php if ( is_page() || have_posts() && is_single() ): the_post(); ?>
<?php if ( has_post_thumbnail() ): ?>
<?php the_post_thumbnail( 'poster', [ 'alt' => '' ] ); ?>
<?php else: ?>
<img src="<?php header_image(); ?>" height="<?php echo get_custom_header()->height; ?>" width="<?php echo get_custom_header()->width; ?>" alt="" />
<?php endif; ?>
<div id="teaserTitle">
<h2><?php the_title(); ?></h2>
</div>
<?php rewind_posts(); ?>
<?php elseif ( get_header_image() ): ?>
<img src="<?php header_image(); ?>" height="<?php echo get_custom_header()->height; ?>" width="<?php echo get_custom_header()->width; ?>" alt="" />
<div id="teaserTitle">
<h2><?php bloginfo( 'description' ); ?></h2>
</div>
<?php endif; ?>
</div>
<div id="main" role="main">
<div id="content">
<?php if ( have_posts() ): ?>
<?php while ( have_posts() ): the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>
<?php else: // FIXME: Wenn berechtigt: Erstellen anbieten ?>
<article id="post-0" class="post no-results not-found">
<?php _e( 'Nicht gefunden.', 'buena-theme' ); ?>
</article>
<?php endif; ?>
</div>
<nav class="pagination">
<div class="previous"><?php previous_posts_link( __( '« Neuere Beiträge', 'buena-theme' ) ); ?></div>
<div class="next"><?php next_posts_link( __( 'Ältere Beiträge »', 'buena-theme' ) ); ?></div>
</nav>
<?php comments_template(); ?>
</div>
</div>
<?php if ( is_active_sidebar( 'footer' ) ): ?>
<footer id="footer">
<ul class="widgets">
<?php dynamic_sidebar( 'footer' ); ?>
</ul>
</footer>
<?php endif; ?>
<?php wp_footer(); ?>
</body>
</html>

27
buena/comments.php Normal file
View File

@ -0,0 +1,27 @@
<?php
if ( post_password_required() ) {
printf( '<p class="nocomments">%s</p>', __( 'Kommentare werden erst angezeigt, wenn das Kennwort eingegeben wurde.', 'buena-theme' ) );
return;
}
// FIXME: Hier sollten die Social-Media-Knöpfe auftauchen…
?>
<div class="comments">
<?php if ( have_comments() ) : ?>
<h4 id="comments"><?php comments_number( 'Keine Kommentare', 'Ein Kommentar', '% Kommentare' );?></h4>
<ul class="commentlist">
<?php wp_list_comments(); ?>
</ul>
<nav class="pagination">
<div class="alignleft"><?php previous_comments_link() ?></div>
<div class="alignright"><?php next_comments_link() ?></div>
</nav>
<?php endif; ?>
<?php if ( comments_open() ) : ?>
<?php comment_form(); ?>
<?php else: ?>
<p class="nocomments screen-reader-text"><?php _e( 'Es kann nicht kommentiert werden.', 'buena-theme' ); ?></p>
<?php endif; ?>
</div>

17
buena/content.php Normal file
View File

@ -0,0 +1,17 @@
<article id="post-<?php the_ID(); ?>" <?php post_class( 'clearfix' ); ?>>
<?php if ( is_singular() ): ?>
<?php the_content(); ?>
<p><?php the_tags(); ?></p>
<?php wp_link_pages( array( 'before' => '<nav class="page-links">Seiten:', 'after' => '</nav>' ) ); ?>
<?php else: ?>
<a class="h h-box h-box-blaugelb<?php if ( ! has_post_thumbnail() ): ?> h-box-blaugelb-bildlos<?php endif; ?>" href="<?php echo esc_url( get_permalink() ); ?>">
<?php the_post_thumbnail( 'gallery-thumb', [ 'alt' => '' ] ); ?>
<?php if ( get_the_title() ): ?>
<header class="wrap">
<h3><?php the_title(); ?></h3>
</header>
<?php endif; ?>
</a>
<?php has_excerpt() ? the_excerpt() : the_content(); ?>
<?php endif; ?>
</article>

104
buena/editor-style.css Normal file
View File

@ -0,0 +1,104 @@
@charset "UTF-8";
@import url("font/ihs.css");
html, body { border: 0 none; padding: 0; margin: 0; min-height: 100%; position: static; }
html { font-family: Sans-Serif; background: url("img/holz.jpg") #dbb97b; position: relative; }
body { margin: 1em; padding: 1em; max-width: 710px; background: #fff; font-size: 81.3% !important; }
body.post-type-gallery { background: transparent; }
header, hgroup, nav, footer, article { display: block; }
.h, h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 { margin: 0; font-family: IHS, Serif; font-size: 1em; font-weight: normal; font-style: normal; }
button, input, select, optgroup, option { margin: 0; font: inherit; color: inherit; }
button, input[type="button"], input[type="submit"], input[type="reset"] { cursor: pointer; }
p, ul, ol, dt { line-height: 1.5; }
abbr { border-bottom: 1px dotted; }
a { color: #1d4899; }
figure, .wp-caption { margin: 0; max-width: 100%; }
figcaption, .wp-caption-text { font-style: italic; padding: 0.5em 0; }
.screen-reader-text { display: none; }
.aligncenter { margin: 0 auto; }
.alignleft { float: left; margin: 0 1em 0 0; }
.alignright { float: right; margin: 0 0 0 1em; }
::-moz-selection { background: #1d4899; color: #ffcb04; text-shadow: none; outline: 2px solid #1d4899; }
::selection { background: #1d4899; color: #ffcb04; text-shadow: none; outline: 2px solid #1d4899; }
/* Media object */
.media { margin: 1em 0; }
.media, .bd { overflow: hidden; _overflow: visible; }
/*.media img { display: block; }*/
/* Clearfix */
.clearfix::after,
.clearfix::before,
.media::after,
.media::before { content: " "; display: table; }
.clearfix::after,
.media::after { clear: both; }
/* Überschriften mit Bild darunter */
.h-box { position: relative; display: block; margin-bottom: 1em; text-decoration: none; }
.h-box > img { position: absolute; top: 0; left: 0; height: 100%; width: 100%; }
.h-box > .wrap { position: absolute; max-width: 100%; left: 0; }
.h-box > .wrap > * { display: inline; -o-box-decoration-break: clone; -webkit-box-decoration-break: clone; box-decoration-break: clone; }
.h-box-teaser { box-shadow: 0 5px 5px rgba(0, 0, 0, 0.3); margin-left: -240px; line-height: 1; display: inline-block; width: 1300px; max-width: 100%; }
.h-box-teaser > img { position: static; }
.h-box-teaser > .wrap { bottom: 1em; padding-left: 240px; }
.h-box-teaser > .wrap > * { background: rgba(56, 46, 35, 0.7); color: #ffcb04; padding: 2px 13px 4px; font-size: 52px; line-height: 78px; }
@media (max-width: 720px) {
.h-box-teaser { margin-top: 1em; margin-left: 0; }
.h-box-teaser > .wrap { padding-left: 1em; }
.h-box-teaser > .wrap > * { font-size: 2em; line-height: 39px; }
}
.h-box-blaugelb { padding-top: 47.1428571%; }
.h-box-blaugelb > .wrap { bottom: 0; font-size: 18px; }
.h-box-blaugelb > .wrap > * { color: #1d4899; background: #ffcb04; padding: 3px 5px; line-height: 26px; }
.h-box-blaugelb-bildlos { padding: 0; }
.h-box-blaugelb-bildlos > .wrap { position: static; }
/**/
.container { max-width: 1020px; }
.page .container,
.single-post:not(.single-format-gallery) .container { max-width: 710px; }
.content-singular .format-gallery { background: transparent; padding: 0; margin: 0; position: relative; }
.content-singular .format-gallery .gallery { display: flex; flex-wrap: wrap; align-content: space-between; align-items: flex-start; }
.content-singular .format-gallery .gallery-item { background: #fff; padding: 1em; margin: 0 1em 1em 0; }
.gallery-columns-1 .gallery-item { flex: 1 0 50%; }
.gallery-columns-2 .gallery-item { flex: 1 0 34%; }
.gallery-columns-3 .gallery-item { flex: 1 0 25%; }
.gallery-columns-4 .gallery-item { flex: 1 0 20%; }
.content-gallery { display: flex; position: relative; z-index: 10; flex-wrap: wrap; overflow: hidden; }
.content-gallery > article { flex: 1 1 25%; }
body > :first-child { margin-top: 0; }
body > :last-child { margin-bottom: 0; }
.content-singular > article:not(.format-gallery),
.content-gallery > article,
.commentlist article,
.comment-form { min-width: 20em; background: #fff; box-shadow: 0 5px 5px rgba(0, 0, 0, 0.1); }
.content-gallery > article { max-width: calc(33.333% - 1em); }
@media (max-width: 800px) { .content-gallery > article { max-width: 100%; } }
/* WordPress-Wünsche */
.sticky {}
img { max-width: 100%; height: auto; border: 0 none; vertical-align: middle; }
ul, ol { padding-left: 2em; }
dl, ul, ol, h1, h2, h3, h4, h5, h6, blockquote, p, table { margin: 0.5em 0; }
dd, li > ol, li > ul { margin: 0; }
dt { font-weight: bold; }
blockquote, dd { padding-left: 2em; }
body > p:empty:last-child { margin: -0.5em 0 0.5em; }
h3, .h3, h4, .h4, h5, .h5, h6, .h6 { display: inline-block; background: #ffcb04; color: #1d4899; margin-bottom: 0; padding: 2px 4px; }
h3, .h3 { font-size: 18px; padding: 3px 5px; }
h4, .h4 { font-size: 16px; }
h5, .h5 { font-size: 14px; }
.gallery-caption {}
.bypostauthor {}
.twitter-tweet {}
h1, .h1, h2, .h2 { font-size: 20px; }
h1::after, h2::after { color: red; background: black; display: block; padding: 5px; content: "Bitte Überschriften ab 3. Ordnung benutzen."; }

11
buena/font/ihs.css Normal file
View File

@ -0,0 +1,11 @@
@font-face {
font-family: IHS;
src: url('ihs.eot');
src: url('ihs.eot?#iefix') format('embedded-opentype'),
url('ihs.woff2') format('woff2'),
url('ihs.woff') format('woff'),
url('ihs.ttf') format('truetype'),
url('ihs.svg#immenhausenregular') format('svg');
font-weight: normal;
font-style: normal;
}

BIN
buena/font/ihs.eot Normal file

Binary file not shown.

1825
buena/font/ihs.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 135 KiB

BIN
buena/font/ihs.ttf Normal file

Binary file not shown.

BIN
buena/font/ihs.woff Normal file

Binary file not shown.

BIN
buena/font/ihs.woff2 Normal file

Binary file not shown.

89
buena/functions.php Normal file
View File

@ -0,0 +1,89 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
die( 'Im a theme.' );
}
if ( ! function_exists( 'trigger_pfadfinden_plugin_error' ) ) {
/**
* Show an error message.
*
* @see http://www.squarepenguin.com/wordpress/?p=6 Inspiration
*
* @param string $message
* @param int $type optional
* @return bool
*/
function trigger_pfadfinden_plugin_error( $message, $type = 0 )
{
if ( isset( $_GET['action'] ) && 'error_scrape' === $_GET['action'] ) {
echo $message;
return true;
}
if ( ! $type ) {
$type = E_USER_WARNING;
}
return trigger_error( $message, $type );
}
}
// Check for suitable environment
if ( defined( 'PHP_VERSION_ID' ) && PHP_VERSION_ID >= 50400 ) {
// Register autoloader if updater plugin missing
if ( ! class_exists( 'Shy\WordPress\Theme' ) ) {
if ( ! include_once __DIR__ . '/use/shy-wordpress/src/autoloader.php' ) {
trigger_pfadfinden_plugin_error(
__( 'Das Theme ist unvollständig und konnte nicht geladen werden. Neuinstallation müsste helfen.', 'buena-theme' ),
E_USER_ERROR
);
return;
}
}
// Register our autoloader
if ( ! include_once __DIR__ . '/src/autoloader.php' ) {
trigger_pfadfinden_plugin_error(
__( 'Das Theme ist unvollständig und konnte nicht geladen werden. Neuinstallation müsste helfen.', 'buena-theme' ),
E_USER_ERROR
);
return;
}
/**
* @return \Pfadfinden\WordPress\BuenaTheme
*/
function buena_get_theme()
{
static $theme = null;
if (!$theme) {
$theme = new ReflectionClass( 'Pfadfinden\WordPress\BuenaTheme' );
$theme = $theme->newInstance();
}
return $theme;
}
/**
* @param string $method
* @return callable
*/
function buena_get_callback( $method )
{
return array( buena_get_theme(), (string) $method );
}
return buena_get_theme();
}
// Display error message
trigger_pfadfinden_plugin_error(
sprintf(
__( 'You need at least PHP 5.4 to use the Buena theme. Your are using %s.', 'buena-theme' ),
PHP_VERSION
),
E_USER_ERROR
);

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 B

BIN
buena/img/bleistift.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
buena/img/briefumschlag.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

BIN
buena/img/bundeszeichen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
buena/img/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
buena/img/hamburger.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

BIN
buena/img/holz.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
buena/img/icon-drucken.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 639 B

BIN
buena/img/icon-kontakt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 561 B

BIN
buena/img/klufthemd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
buena/img/leitbild_bund.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
buena/img/leitbild_ihs.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
buena/img/loeffel-topf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

1
buena/img/lupe.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 2400 2400" width="14" height="14"><path style="fill:#fff;stroke:none" d="m 975,25 q 129,0 252,34 123,34 227,95.5 104,61.5 191.5,149 87.5,87.5 149,192 61.5,104.5 95.5,227.5 34,123 34,251 0,278 -152,514 l 588,588 q 15,14 15,35 0,21 -15,36 l -213,213 q -15,15 -36,15 -21,0 -35,-15 l -588,-588 q -235,152 -513,152 -129,0 -252,-34 Q 600,1856 496,1794.5 392,1733 304,1645.5 216,1558 155,1453.5 94,1349 59.5,1226 25,1103 25,974.5 25,846 59.5,723 94,600 155,495.5 216,391 304,303.5 392,216 496,154.5 600,93 723,59 846,25 975,25 Z m -0.5,302 Q 843,327 723,378 603,429 516.5,516 430,603 378.5,723 327,843 327,974.5 q 0,131.5 51.5,251.5 51.5,120 138,207 86.5,87 206.5,138 120,51 251.5,51 131.5,0 251.5,-51 120,-51 207,-138 87,-87 138.5,-207 Q 1623,1106 1623,974.5 1623,843 1571.5,723 1520,603 1433,516 1346,429 1226,378 1106,327 974.5,327 Z" /></svg>

After

Width:  |  Height:  |  Size: 907 B

1
buena/img/schatten.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns='http://www.w3.org/2000/svg' height='300' width='470' viewBox='0 0 300 425' preserveAspectRatio='xMinYMin meet'><defs><linearGradient id='v' x1='0' y1='0' x2='0' y2='140%'><stop offset='0' stop-color='#000' stop-opacity='0.7' /><stop offset='50%' stop-color='#000' stop-opacity='0.4' /><stop offset='80%' stop-color='#000' stop-opacity='0.1' /><stop offset='100%' stop-color="#000" stop-opacity='0' /></linearGradient></defs><path d='M10,200 C150,170 450,180 615,190 L608,00 L15,0 Z' style='stroke:none;' fill='url(#v)'></path></svg>

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

106
buena/index.php Normal file
View File

@ -0,0 +1,106 @@
<!DOCTYPE html>
<!--[if IE 7]>
<html class="ie ie7" <?php language_attributes(); ?>>
<![endif]-->
<!--[if IE 8]>
<html class="ie ie8" <?php language_attributes(); ?>>
<![endif]-->
<!--[if !(IE 7) | !(IE 8) ]><!-->
<html <?php language_attributes(); ?>>
<!--<![endif]-->
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<?php if ( ! function_exists( 'has_site_icon' ) || ! has_site_icon() ): // FIXME: Remove workaround on 2016-02-16 ?>
<link rel="shortcut icon" href="<?php echo esc_url( get_template_directory_uri() ); ?>/img/favicon.ico" />
<?php endif; ?>
<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />
<?php if ( is_singular() ) wp_enqueue_script( 'comment-reply' ); ?>
<?php wp_head(); ?>
</head>
<!-- FIXME: Mehr ARIA role setzen -->
<body <?php body_class(); ?>>
<div id="wrap"><!-- FIXME: Klassen hfeed, site? -->
<header id="header" role="banner"><!-- FIXME: Klasse site-header? -->
<hgroup id="branding">
<h1 class="site-title">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" title="<?php _e( 'Zurück zur Startseite', 'buena-theme' ); ?>">
<img alt="Bund der Pfadfinderinnen und Pfadfinder" src="<?php echo esc_url( get_template_directory_uri() ); ?>/img/bundeszeichen.png" srcset="<?php echo esc_url( get_template_directory_uri() ); ?>/img/bundeszeichen.png 1x, <?php echo esc_url( get_template_directory_uri() ); ?>/img/bundeszeichen@2x.png 2x" width="390" height="79" />
</a>
</h1>
<h2 class="site-description">
<?php echo esc_html( get_bloginfo( 'name', 'display' ) ); ?>
</h2>
</hgroup>
<nav>
<!-- FIXME: Tollere Navigation ausdenken -->
<a href="#content" class="screen-reader-text"><?php _e( 'Zum Inhalt springen', 'buena-theme' ); ?></a>
<button type="button" id="responsiveMenu" title="<?php esc_attr_e( 'Menü', 'buena-theme' ); ?>">
<img alt="<?php esc_attr_e( 'Menü', 'buena-theme' ); ?>" src="<?php echo esc_url( get_template_directory_uri() ); ?>/img/hamburger.png" width="32" height="32" />
</button>
</nav>
<?php do_action( 'buena_search_form' ); ?>
</header>
<div id="left">
<?php wp_nav_menu( [ 'theme_location' => 'primary', 'depth' => 2, 'container' => 'nav', 'container_class' => 'nav-menu nav-menu-primary' ] ); ?>
<?php if ( is_active_sidebar( 'below-navigation' ) ): ?>
<ul class="widgets">
<?php dynamic_sidebar( 'below-navigation' ); ?>
</ul>
<?php endif; ?>
</div>
<?php if ( $buenaTeaserImage = buena_get_theme()->getTeaserImage() ): ?>
<header class="h h-box h-box-teaser">
<?php echo $buenaTeaserImage; ?>
<hgroup class="wrap">
<h2><?php buena_get_theme()->printTitle(); ?></h2>
</hgroup>
</header>
<?php else: ?>
<header class="h">
<h2><?php buena_get_theme()->printTitle(); ?></h2>
</header>
<?php endif; ?>
<div id="main" role="main" class="container">
<div id="content" class="content-<?php if ( is_singular() ): ?>singular<?php else: ?>gallery<?php endif; ?>">
<?php if ( have_posts() ): ?>
<?php while ( have_posts() ): the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>
<?php else: // FIXME: Wenn berechtigt: Erstellen anbieten ?>
<article id="post-0" class="post no-results not-found">
<?php _e( 'Nicht gefunden.', 'buena-theme' ); ?>
</article>
<?php endif; ?>
</div>
<nav class="pagination">
<div class="alignright"><?php next_posts_link( __( 'Ältere Beiträge »', 'buena-theme' ) ); ?></div>
<div class="alignleft"><?php previous_posts_link( __( '« Neuere Beiträge', 'buena-theme' ) ); ?></div>
</nav>
<?php comments_template(); ?>
</div>
</div>
<footer id="footer">
<div class="wrapper media">
<?php if ( is_active_sidebar( 'footer' ) || has_nav_menu( 'footer' ) ): ?>
<header class="h">
<?php echo esc_html( get_bloginfo( 'name', 'display' ) ?: 'Bund der Pfadfinderinnen und Pfadfinder e.V.' ); ?>
</header>
<?php wp_nav_menu( [ 'theme_location' => 'footer', 'container' => 'nav', 'container_class' => 'nav-menu nav-menu-footer alignleft', 'fallback_cb' => '' ] ); ?>
<ul class="widgets bd">
<?php dynamic_sidebar( 'footer' ); ?>
</ul>
<?php endif; ?>
</div>
</footer>
<script>
+function() {
document.getElementById('responsiveMenu').addEventListener('click', function() {
document.body.classList.toggle('show-responsive-menu');
});
}();
</script>
<?php wp_footer(); ?>
</body>
</html>

103
buena/readme.txt Normal file
View File

@ -0,0 +1,103 @@
Buena
=======
Das WordPress-Theme zum neuen Corporate Design des BdP.
Änderungswünsche? Kritik?
philipp.cordes@pfadfinden.de
Anderthalb Hinweise zur Benutzung
-----------------------------------
Das Theme ist noch nicht ganz fertig, an einigen Stellen wird noch gehobelt.
In Beiträgen mögt ihr bitte erst Überschriften ab 3. Ordnung verwenden,
die erster Ordnung sind für den Header und die zweiter Ordnung sind für
die Titel der Beiträge. Es gibt dafür auch fette Hinweise beim Bearbeiten.
Eine kleine Änderungshistorie
-------------------------------
v1.0 - TODO
- Das Abschalten des Posterbilds für ist Seiten und Beiträge ohne Bild möglich.
- Beitragsarten und deren unterschiedliche Darstellung ist auch für Seiten verfügbar.
- Schmale Beitragsbilder (<1300px Breite) zerlegen das Layout nicht mehr.
- Login-Formular im Widgetbereich unterstützen.
v0.99.7 - 21.09.2015
- Safari bricht jetzt Artikelauflistungen richtig um. Die anderen machen es auch etwas besser.
- Safari zeigt jetzt Suchfelder richtig an.
- Safari malt die Trennline in der Navigation nicht mehr zu dick.
- Wenn das Ajax-Login-Formular benutzt wird, verschwindet das Hamburgermenü nicht mehr.
v0.99.6 - 19.09.2015
- Weitere Blau- und Gelbtöne einheitlich umgesetzt, v.a. im Editor.
- Update für Milu: Zusatz „Kategorie“ wird im Titel auf abendlager.pfadfinden.de nicht mehr angezeigt.
- Der linke Rand wird jetzt immer eingehalten, egal wie lang der Navigationsbereich ist.
- Anpassung an WordPress 4.3: Favicon kommt nur aus dem Theme, wenn kein eigenes gesetzt ist.
- Der Hinweis, dass Kommentare nicht möglich sind, wird standardmäßig ausgeblendet.
- Links in der Navigation färben sich jetzt anhand der Hierarchie im Menü ein, nicht derer der Seiten.
v0.99.5 - 19.08.2015
- Seitentitel beschreiben jetzt besser, was tatsächlich angezeigt wird.
- Farben aus dem Handbuch einheitlich umgesetzt.
v0.99.4 - 13.08.2015
- Das Menü wird automatisch wieder eingeblendet, wenn die Fensterbreite über 720px steigt.
- Fehlerkorrektur: Es werden keine Urls mehr unter dem Editorfeld ausgegeben.
- Das Theme ist nicht mehr auf das Plugin angewiesen. Die benötigte Bilbiothek shy-wordpress wird direkt mitgeliefert.
v0.99.3 - 01.08.2015
- Der Editor sollte jetzt in den meisten Fällen eine realistische Vorschau bieten.
- Überschriften sind jetzt blau auf gelb.
Überschriften erster und zweiter Ordnung in Beiträgen und Seiten werden durch Überschriften dritter Ordnung ersetzt.
- Schrift „Immenhausen“ durch verbesserte Variante ausgetauscht.
- Kleinere Korrekturen an Abständen.
v0.99.2 - 27.07.2015
- Kleinere Textanpassungen.
v0.99.1 - 27.07.2015
- Auf großen Displays wird das Beitragsbild nicht mehr verzerrt.
v0.99 - 26.07.2015
- Erster Kandidat zur Veröffentlichung als Version 1.0.
- Die Überschriften erstrahlen in vollem Glanz.
- Kommentare sehen besser aus.
- Das Theme ist responsive bis runter auf 300px.
- Fußleiste überarbeitet und zweigeteilt.
v0.9.1 - 07.07.2015
- Fehlerkorrektur: Der Titel wird nicht mehr doppelt angezeigt.
v0.9 - 03.07.2015
- Kommentare werden jetzt angezeigt.
- Etwas mehr responsive: Mindestbreite 700px für ordentliche Anzeige.
v0.8 - 21.06.2015
- Standardwidgets sehen jetzt in der Leiste gut aus.
- Die Fußzeile sitzt jetzt fester an ihrem Platz.
v0.7 - 18.06.2015
- Große Posterbilder hinzugefügt, die auch auf der Bundeswebseite zu sehen sind.
- Erhebliche Verbesserungen der Darstellung.
v0.6 - 16.06.2015
- Mehr Unterstützung für HTML5.
v0.5 - 16.06.2015
- Fehler behoben, der die WordPress-Installation unbrauchbar machen könnte.
v0.4 - 11.06.2015
- Navigation überarbeitet.
v0.3 - 10.06.2015
- Webfont Immenhausen für Überschriften.
v0.2 - 04.06.2015
- Grafiken eingebaut.
v0.1 - 20.04.2015
- Erste Veröffentlichung.

BIN
buena/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

11
buena/searchform.php Normal file
View File

@ -0,0 +1,11 @@
<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
<label>
<span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ); ?></span>
<?php if ( doing_action( 'buena_search_form' ) ): ?>
<input type="search" class="search-field" value="<?php echo get_search_query(); ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ); ?>" />
<?php else: ?>
<input type="search" class="search-field" placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder' ); ?>" value="<?php echo get_search_query(); ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ); ?>" />
<?php endif; ?>
</label>
<button type="submit" class="search-submit" title="<?php esc_attr_e( 'Query search', 'buena-theme' ); ?>"><?php echo esc_html_x( 'Search', 'submit button' ); ?></button>
</form>

View File

@ -0,0 +1,23 @@
<?php
namespace Pfadfinden\WordPress;
use Shy\WordPress\CompositeOption;
class BuenaSettings extends CompositeOption
{
public function __construct()
{
parent::__construct( 'buena-theme' );
}
public function getDefaults()
{
return [
'use_cdn' => false,
'always_show_poster' => true,
];
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace Pfadfinden\WordPress;
use Shy\WordPress\Administration\SettingsPage;
use Shy\WordPress\Administration\CheckboxField;
class BuenaSettingsPage extends SettingsPage
{
public function getFields()
{
$this->addSection( '', 'buena' );
return array(
'use_cdn' => new CheckboxField(),
'always_show_poster' => new CheckboxField(),
);
}
public function getParentSlug()
{
return 'themes.php';
}
public function getTitle()
{
return __( 'Buena-Einstellungen', 'buena-theme' );
}
}

View File

@ -0,0 +1,317 @@
<?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
}
}

19
buena/src/autoloader.php Normal file
View File

@ -0,0 +1,19 @@
<?php
/**
* Try to load a Pfadfinden WordPress class.
*
* @param string $name
* @return bool
*/
function buena_autoloader( $name )
{
if ( substr( $name, 0, 21 ) !== 'Pfadfinden\\WordPress\\' ) {
return false;
}
$name = __DIR__ . '/' . str_replace( '\\', DIRECTORY_SEPARATOR, $name ) . '.php';
return is_file( $name ) && include( $name );
}
spl_autoload_register( 'buena_autoloader' );

250
buena/style.css Normal file
View File

@ -0,0 +1,250 @@
@charset "UTF-8";
/**
Theme Name: Buena
Version: 0.99.7
Theme URI: http://lab.hanseaten-bremen.de/themes/buena/
Author: Philipp Cordes <philipp.cordes@pfadfinden.de>
Description: Das neue Corporate Design, jetzt auch für WordPress.
License: Proprietary
Tags: one-column, three-columns, responsive-layout, automatic-feed-links, post-thumbnails, featured-images, custom-menu, blue, white, yellow, editor-style
*/
/*
Farben:
- gelb: #ffcb04 (Handbuch, manchmal T3), #ffca28 (T3)
- Verlauf: #9f7515 bis #e1af22, #e0cb84 bis #fff (IE-Fallback)
- blass: #fff5d9 (T3-Zebra)
- blau: #1d4899 (Handbuch, manchmal T3), #0d52a5 (T3)
- Markierung (T3): #b3d4fc
*/
html, body { border: 0 none; padding: 0; margin: 0; min-height: 100%; position: static; }
html { font-family: Sans-Serif; font-size: 81.3%; background: url("img/holz.jpg") #dbb97b; position: relative; }
header, hgroup, nav, footer, article { display: block; }
.h, h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 { margin: 0; font-family: IHS, Serif; font-size: 1em; font-weight: normal; font-style: normal; }
button, input, select, optgroup, option { margin: 0; font: inherit; color: inherit; }
button, input[type="button"], input[type="submit"], input[type="reset"] { cursor: pointer; }
input[type="search"] { -webkit-appearance: textfield; }
p, ul, ol, dt { line-height: 1.5; }
abbr { border-bottom: 1px dotted; }
a { color: #1d4899; }
figure, .wp-caption { margin: 0; max-width: 100%; }
figcaption, .wp-caption-text { font-style: italic; padding: 0.5em 0; }
.screen-reader-text { display: none; }
.aligncenter { margin: 0 auto; }
.alignleft { float: left; margin: 0 1em 0 0; }
.alignright { float: right; margin: 0 0 0 1em; }
::-moz-selection { background: #1d4899; color: #ffcb04; text-shadow: none; outline: 2px solid #1d4899; }
::selection { background: #1d4899; color: #ffcb04; text-shadow: none; outline: 2px solid #1d4899; }
/* Media object */
.media { margin: 1em 0; }
.media, .bd { overflow: hidden; _overflow: visible; }
/*.media img { display: block; }*/
/* Clearfix */
.clearfix::after,
.clearfix::before,
.media::after,
.media::before { content: " "; display: table; }
.clearfix::after,
.media::after { clear: both; }
/* Layout */
#wrap { background: url("img/klufthemd.png") no-repeat; padding: 0 0 2em; }
#footer { background: url("img/loeffel-topf.png") no-repeat 100% 100%; position: absolute; width: 100%; bottom: 0; }
#footer .wrapper { background: url("img/briefumschlag.png") no-repeat; margin: 0 0 0 240px; padding: 112px 7px 0 21px; height: 286px; width: 700px; box-sizing: border-box; }
#footer header { color: #ffcb04; text-align: center; font-size: 25px; margin: -111px 0 13px; line-height: 111px; }
#footer .widgets { padding: 0 2em 0 0; }
#left { margin: -18px -200px 0 40px; width: 160px; z-index: 30; float: left; position: relative; }
#main { overflow: hidden; padding: 0 0 286px 240px; }
@media (max-width: 960px) {
/* Umschlag unter die Navigation umbrechen */
#left { margin-bottom: 300px; }
#footer .wrapper { margin-left: 0; }
}
@media (max-width: 720px) {
#main { padding-left: 0; }
#left { margin-right: 0; }
}
/* FIXME: Positionierung des Schattens weiter vereinfachen, auch Untertitel verlinken. */
/* FIXME: Branding umbenennen, siehe https://github.com/pfadfinden/wordpress-theme-updater/issues/13 */
#branding { min-height: 145px; padding: 0 33px 20px 240px; text-align: center; position: relative; width: 425px; margin-bottom: -27px; }
#branding::after { content: ""; display: block; position: absolute; bottom: 0; right: 0; z-index: 15; height: 143px; width: 457px; background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGhlaWdodD0nMzAwJyB3aWR0aD0nNDcwJyB2aWV3Qm94PScwIDAgMzAwIDQyNScgcHJlc2VydmVBc3BlY3RSYXRpbz0neE1pbllNaW4gbWVldCc+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSd2JyB4MT0nMCcgeTE9JzAnIHgyPScwJyB5Mj0nMTQwJSc+PHN0b3Agb2Zmc2V0PScwJyBzdG9wLWNvbG9yPScjMDAwJyBzdG9wLW9wYWNpdHk9JzAuNycgLz48c3RvcCBvZmZzZXQ9JzUwJScgc3RvcC1jb2xvcj0nIzAwMCcgc3RvcC1vcGFjaXR5PScwLjQnIC8+PHN0b3Agb2Zmc2V0PSc4MCUnIHN0b3AtY29sb3I9JyMwMDAnIHN0b3Atb3BhY2l0eT0nMC4xJyAvPjxzdG9wIG9mZnNldD0nMTAwJScgc3RvcC1jb2xvcj0iIzAwMCIgc3RvcC1vcGFjaXR5PScwJyAvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9J00xMCwyMDAgQzE1MCwxNzAgNDUwLDE4MCA2MTUsMTkwIEw2MDgsMDAgTDE1LDAgWicgc3R5bGU9J3N0cm9rZTpub25lOycgZmlsbD0ndXJsKCN2KSc+PC9wYXRoPjwvc3ZnPg0K") no-repeat 50% 0; }
#branding > * { margin: 0; position: relative; z-index: 20; }
.site-title { font-size: 20px; background: #ffcb04; color: #0d53a5; margin-top: auto; line-height: 115px; }
.site-title a { display: block; vertical-align: bottom; }
.site-title img { vertical-align: bottom; padding-bottom: 16px; }
.site-description { font-size: 18px; background: #0d53a5; color: #ffcb04; line-height: 30px; font-family: IHS, Serif; letter-spacing: 1px; word-spacing: 2px; }
#header .search-form { background: url("img/streichholzschachtel.png") no-repeat; position: absolute; height: 89px; left: 750px; top: 1.5em; width: 98px; padding: 25px 47px 0 35px; }
#header .search-form label { display: block; position: relative; margin: 25px 0 -50px; text-align: left; }
#header .search-field { background: transparent; border: 2px solid #ffcb04; padding: 2px; color: #fff; display: block; max-width: 100%; box-sizing: border-box; }
#header .search-submit { background: transparent; color: #ffcb04; border: 0 none; font-family: IHS, Serif; font-size: 1.4em; padding: 0; display: block; box-sizing: border-box; }
#header > nav { position: absolute; top: 0; right: 0; z-index: 9999; display: none; }/* FIXME: Workaround Branding-Doppelung */
#responsiveMenu { border: 0 none; background: transparent; height: 51px; margin: 1em; }
@media (max-width: 960px) { /* Suche ausblenden */
#header .search-form { display: none; }
}
.nav-menu ul { list-style: none; padding: 0; margin: 0; }
.nav-menu-primary > ul { font-family: IHS, Serif; }
.nav-menu-primary > ul > .current-menu-ancestor,
.nav-menu-primary > ul > .current-menu-item { background: #e1af22 no-repeat; background-image: linear-gradient(#9f7515 0%, #e1af22 100%); border-bottom: 1px solid #9f7515; border-top: 1px solid #9f7515; margin: 0.5em 0; padding: 0.5em 0; }
.nav-menu-primary .sub-menu { display: none; }
.nav-menu-primary a { padding: 0.4em 0.5em 0.4em 1em; display: block; text-decoration: none; color: #6b5742; font-size: 1.4em; }
.nav-menu-primary li ul a { font-family: Georgia, Serif; font-size: 12px; font-style: italic; padding: 5px 5px 5px 25px; color: #000; }
.nav-menu-primary .current-menu-ancestor .sub-menu,
.nav-menu-primary .current-menu-item .sub-menu { display: block; }
.nav-menu-primary .current-menu-ancestor a { color: #000; }
.nav-menu-primary .current-menu-item > a { color: #fff; }
.nav-menu-primary a:hover,
.nav-menu-primary a:focus { color: #000; }
.nav-menu .current-menu-ancestor a:hover,
.nav-menu .current-menu-ancestor a:focus,
.nav-menu .sub-menu a:hover,
.nav-menu .sub-menu a:focus,
.nav-menu-footer a:hover,
.nav-menu-footer a:focus { text-decoration: underline; }
.nav-menu-footer { font-family: Georgia, Serif; font-style: italic; padding-left: 2em; }
.nav-menu-footer > ul { width: 323px; height: 174px; position: relative; display: flex; -webkit-flex-flow: column; flex-flow: column; -webkit-justify-content: center; justify-content: center; -webkit-align-items: stretch; align-items: stretch; }
.nav-menu-footer li { margin-bottom: 0.75em; }
.nav-menu-footer a { padding: 4px 4px 4px 25px; text-decoration: none; }
.widget_recent_entries > ul,
.widget_recent_comments > ul,
.widget_archive > ul,
.widget_categories > ul,
.widget_meta > ul { list-style: none; padding: 0; margin: 0; }
#left > .nav-menu { background: #ffcb04; color: #6b5742; padding: 10px 0 2em; }
#left > .widgets { background: rgba(56, 46, 35, 0.7); color: #ffcb04; padding: 1em 15px 15px 20px; font-size: 13px; font-style: italic; }
#left > .widgets a { color: #fff; text-decoration: none; }
#left > .widgets a:hover,
#left > .widgets a:focus { text-decoration: underline; }
/* Widgets: Basisdarstellung */
.widgets { list-style: none; padding: 0; margin: 0; font-family: Georgia, Serif; font-style: italic; }
.widget_calendar table { text-align: center; }
/* Widgets: Korrekturen für unsere Seitenleiste */
#left .widget_search form { display: flex; }
#left .widget_search form > * { border: 2px solid #ffcb04; }
#left .widget_search input { box-sizing: border-box; width: 100%; border: 0 none; background: transparent; color: #fff; text-align: center; padding: 3px 0.25em 4px; }
#left .widget_search button { color: transparent; background: url("res/lupe.svg") 50% 50% no-repeat #ffcb04; width: 31px; }
#left .widget_calendar > div { margin: 0 -15px 0 -20px; }
#left .widget_calendar > div > table { text-align: center; margin: 0 auto; }
#left .widget_pages ul { padding-left: 2em; }
#left .widget_pages > ul { list-style: none; padding: 0; }
#left > .widgets .widget { margin: 0; padding: 1em 0; }
.widgets .h-widget { color: #ffcb04; font-size: 16px; }
#left > .widgets .menu,
.widgets .widget_categories ul { list-style: none; padding: 0; }
/* Überschriften mit Bild darunter */
.h-box { position: relative; display: block; margin-bottom: 1em; text-decoration: none; }
.h-box > img { position: absolute; top: 0; left: 0; height: 100%; width: 100%; }
.h-box > .wrap { position: absolute; max-width: 100%; left: 0; }
.h-box > .wrap > * { display: inline; -o-box-decoration-break: clone; -webkit-box-decoration-break: clone; box-decoration-break: clone; }
.h-box-teaser { box-shadow: 0 5px 5px rgba(0, 0, 0, 0.3); line-height: 1; display: inline-block; width: 1300px; max-width: 100%; }
.h-box-teaser > img { position: static; }
.h-box-teaser > .wrap { bottom: 1em; padding-left: 240px; }
.h-box-teaser > .wrap > * { background: rgba(56, 46, 35, 0.7); color: #ffcb04; padding: 2px 13px 4px; font-size: 52px; line-height: 78px; }
@media (max-width: 720px) {
.h-box-teaser { margin-top: 1em; margin-left: 0; }
.h-box-teaser > .wrap { padding-left: 1em; }
.h-box-teaser > .wrap > * { font-size: 2em; line-height: 39px; }
}
.h-box-blaugelb { padding-top: 47.1428571%; }
.h-box-blaugelb > .wrap { bottom: 0; font-size: 18px; }
.h-box-blaugelb > .wrap > * { color: #1d4899; background: #ffcb04; padding: 3px 5px; line-height: 26px; }
.h-box-blaugelb-bildlos { padding: 0; }
.h-box-blaugelb-bildlos > .wrap { position: static; }
/**/
.container { max-width: 1020px; }
.page .container,
.single-post:not(.single-format-gallery) .container { max-width: 710px; }
.content-singular .format-gallery { background: transparent; padding: 0; margin: 0; position: relative; }
.content-singular .format-gallery .gallery { display: flex; -webkit-flex-wrap: wrap; flex-wrap: wrap; -webkit-align-content: space-between; align-content: space-between; -webkit-align-items: flex-start; align-items: flex-start; }
.content-singular .format-gallery .gallery-item { background: #fff; padding: 1em; margin: 0 1em 1em 0; }
.gallery-columns-1 .gallery-item { flex: 1 0 50%; }
.gallery-columns-2 .gallery-item { flex: 1 0 34%; }
.gallery-columns-3 .gallery-item { flex: 1 0 25%; }
.gallery-columns-4 .gallery-item { flex: 1 0 20%; }
.content-gallery { display: flex; position: relative; z-index: 10; -webkit-flex-wrap: wrap; flex-wrap: wrap; overflow: hidden; }
.container article,
.commentlist article,
.comment-form { padding: 1em; margin: 0 1em 1em 0; transition: width 0.5s, height 0.5s; box-sizing: border-box; }
.container article > :first-child,
.comment-form > :first-child { margin-top: 0; }
.container article > :last-child,
.comment-form > .form-submit { margin-bottom: 0; }
.content-singular > article:not(.format-gallery),
.content-gallery > article,
.commentlist article,
.comment-form { min-width: 20em; background: #fff; box-shadow: 0 5px 5px rgba(0, 0, 0, 0.1); }
.content-gallery > article { flex: 1 1 25%; max-width: calc(33.333% - 1em); }
@media (max-width: 1070px) { .content-gallery > article { flex: 1 1 34%; max-width: calc(50% - 1em); } }
@media (max-width: 800px) { .content-gallery > article { flex: 1 1 50%; max-width: 100%; } }
.container > .pagination { margin-right: 1em; }
/* WordPress-Wünsche */
.sticky {}
img { max-width: 100%; height: auto; border: 0 none; vertical-align: middle; }
ul, ol { padding-left: 2em; }
dl, ul, ol, h1, h2, h3, h4, h5, h6, blockquote, p, table { margin: 0.5em 0; }
dd, li > ol, li > ul { margin: 0; }
dt { font-weight: bold; }
blockquote, dd { padding-left: 2em; }
article > p:empty:last-child { margin: -0.5em 0 0.5em; }
article h3, article .h3, article h4, article .h4, article h5, article .h5, article h6, article .h6 { display: inline-block; background: #ffcb04; color: #1d4899; margin-bottom: 0; padding: 2px 4px; }
article h3, article .h3 { font-size: 18px; padding: 3px 5px; }
article h4, article .h4 { font-size: 16px; }
article h5, article .h5 { font-size: 14px; }
.gallery-caption {}
.bypostauthor {}
.twitter-tweet {}
/* Kommentare */
#comments, #reply-title { font-size: 2.5em; color: #fff; margin: 0.5em 0 0.25em; }
.commentlist { list-style: none; padding: 0; }
.commentlist .children { list-style: none; padding-left: 1em; }
.comment-form > p > * { vertical-align: top; }
.comment-form > p > label::after { content: ": "; }
.comment-body { position: relative; }
.comment-metadata { position: absolute; top: 1em; right: 1em; display: flex; -webkit-flex-direction: column; flex-direction: column; -webkit-justify-content: flex-end; justify-content: flex-end; }
.comment-form textarea { resize: vertical; display: block; box-sizing: border-box; width: 100%; }
/* Responsive: Der komplizierte Kram. Hurra! */
@media (max-width: 720px) { /* Gestapelt anordnen */
#main { padding-bottom: 0; }
#wrap, #footer .wrapper { background-image: none; }
#branding { text-align: left; width: auto; padding: 0; margin: 0; min-height: 0; }
#branding::after { display: none; background-image: none; }
#branding h1 { line-height: 51px; }
#branding h2 { padding: 0 1em; }
.site-title a { display: inline-block; }
.site-title img { height: 51px; width: auto; padding: 13px; }
#header > nav { display: block; }
#left { float: none; transition: 0.5s height; margin: 0; width: auto; }
#left, #left .widgets { display: none; }
.show-responsive-menu #left { display: block; }
#content, .comments { margin-left: 1em; }
#footer { background: #c4a164; position: static; }
#footer .wrapper { padding: 1em; height: auto; width: auto; }
#footer header { color: #000; margin: 0; line-height: 1.5; }
.nav-menu-footer, #footer .widgets { float: none; margin: 1em 0 0; padding: 1em; }
.nav-menu-footer > ul { height: auto; }
}

7
buena/use/shy-wordpress/.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
# Eclipse project files
.buildpath
.project
.settings
# Local PHPUnit configuration
phpunit.xml

View File

@ -0,0 +1,7 @@
<phpunit boostrap="tests/bootstrap.php">
<testsuites>
<testsuite>
<directory suffix="Test.php" phpVersion="5.4.0">tests</directory>
</testsuite>
</testsuites>
</phpunit>

View File

@ -0,0 +1,98 @@
<?php
namespace Shy\WordPress;
/**
* A composite option with a fixed number of suboptions and their default values.
*/
abstract class CompositeOption implements \ArrayAccess, \Countable, \IteratorAggregate
{
use HookableTrait;
/**
* @var string
*/
protected $slug;
/**
* @return string
*/
public function getSlug()
{
return $this->slug;
}
protected function __construct( $slug )
{
$this->slug = (string) $slug;
$this->addHookMethod( 'default_option_' . $this->slug, 'getDefaults' );
}
/**
* Return default values for all suboptions.
* Hooked into get_option() defaults.
*
* @return array
*/
abstract public function getDefaults();
/**
* @param string $offset
* @return mixed
*/
public function getDefault( $offset )
{
return $this->getDefaults()[ $offset ];
}
public function offsetExists( $offset )
{
$settings = get_option( $this->slug );
return isset( $settings[ $offset ] );
}
public function offsetGet( $offset )
{
$settings = get_option( $this->slug );
if ( ! isset( $settings[ $offset ] ) ) {
throw new \OutOfBoundsException( "There is no setting '$offset'." );
}
return $settings[ $offset ];
}
public function offsetSet( $offset, $value )
{
$settings = get_option( $this->slug );
if ( ! isset( $settings[ $offset ] ) ) {
throw new \OutOfBoundsException( "There is no setting '$offset'." );
}
$settings[ $offset ] = $value;
update_option( $this->slug, $settings );
}
public function offsetUnset( $offset )
{
throw new \BadMethodCallException( 'You cannot unset settings.' );
}
public function count()
{
return count( $this->getDefaults() );
}
public function getIterator()
{
return new \ArrayIterator( get_option( $this->slug ) );
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace Shy\WordPress;
/**
* Making actions and filters how they should be.
*
* Default to pass all arguments.
*/
trait HookableTrait
{
/**
* @param string $action_or_filter
* @param string $method
* @param int $priority
* @param int $acceptedArgs
*/
protected function addHookMethod( $action_or_filter, $method, $priority = 10, $acceptedArgs = 99 )
{
add_filter( $action_or_filter, array( $this, $method ), $priority, $acceptedArgs );
}
/**
* @param string $action_or_filter
* @param string $method
* @param int $priority
* @param int $acceptedArgs
*/
protected function removeHookMethod( $action_or_filter, $method, $priority = 10, $acceptedArgs = 99 )
{
remove_filter( $action_or_filter, array( $this, $method ), $priority, $acceptedArgs );
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace Shy\WordPress;
/**
* Marker class for WordPress plugins.
*/
abstract class Plugin
{
use HookableTrait;
}

View File

@ -0,0 +1,383 @@
<?php
namespace Shy\WordPress;
/**
* Abstracts common functionality and escaping for the Settings API.
*
* TODO: Check slug and field names for illegal characters.
* TODO: Refactor to not extend but use CompositeOption
*/
abstract class SettingsPage extends CompositeOption
{
use HookableTrait;
/**
* @var string
*/
protected $capability;
/**
* Slug (file name) of the parent menu entry.
*
* @see add_submenu_page() for suggestions.
*
* @return string|null
*/
protected function getParentSlug()
{
return 'options-general.php';
}
/**
* Title for this setting page.
*
* @return string
*/
abstract protected function getPageTitle();
/**
* String to show in the menu entry.
*
* @return string
*/
protected function getMenuTitle()
{
return $this->getPageTitle();
}
/**
* @param string $slug Page slug
* @param string $capability Required capability to view
*/
protected function __construct( $slug, $capability = 'manage_options' )
{
parent::__construct( $slug );
$this->capability = (string) $capability;
$this->addHookMethod( 'admin_menu', 'registerPage' );
$this->addHookMethod( 'admin_init', 'registerSettings' );
}
public function __toString()
{
return $this->slug;
}
/**
* Register our options page.
*
* @return void
*/
public function registerPage()
{
add_submenu_page(
$this->getParentSlug(),
$this->getPageTitle(),
$this->getMenuTitle(),
$this->capability,
$this->slug,
array( $this, 'renderPage' )
);
}
/**
* Register the actual settings.
* Override and use addSection() and add*Field() methods.
*
* @return void
*/
public function registerSettings()
{
register_setting(
$this->slug,
$this->slug,
array( $this, 'sanitizeOptions' )
);
}
/**
* Sanitize option values after form submission.
*
* @param array $options
* @return array
*/
abstract public function sanitizeOptions( array $options );
/**
* Section to add fields to.
*
* Parameter default from add_settings_field().
*
* @var string
*/
protected $currentSection = 'default';
/**
* Add a new section and return its generated name.
*
* @param string $title optional, can be empty
* @param string $name optional, will be generated if empty
* @return string
*/
protected function addSection( $title = '', $name = '' )
{
$name = (string) $name;
if ( ! strlen( $name ) ) {
$name = $this->slug . '-section' . ( count( $this->getSections() ) + 1 );
}
add_settings_section(
$name,
esc_html( $title ),
array( $this, 'renderSectionTeaser' ),
$this->slug
);
return $this->currentSection = $name;
}
/**
* Callback before output of section fields.
*
* Teasers must escape their output themselves.
*
* @param array $section {
* @type string $id
* @type string $title
* @type callable $callback
* }
*/
public function renderSectionTeaser( array $section )
{
}
/**
* Get all known section names on this page.
*
* @global $wp_settings_fields
* @return array<string>
*/
public function getSections()
{
global $wp_settings_fields;
if ( ! isset( $wp_settings_fields[ $this->slug ] ) ) {
return array();
}
return array_keys( $wp_settings_fields[ $this->slug ] );
}
/**
* @global $wp_settings_fields
* @param string $section
* @return array<string, array {
* @type string $id
* @type string $title
* @type callable $callback
* @type array $args
* }>
*/
public function getFieldsForSection( $section )
{
global $wp_settings_fields;
return $wp_settings_fields[ $this->slug ][ $section ];
}
/**
* Add a custom field to this setting page.
*
* @param string $name
* @param string $label
* @param callable $callback
* @param array $args
*/
protected function addField( $name, $label, $callback, $args = array() )
{
if ( ! is_callable( $callback ) ) {
throw new \InvalidArgumentException( 'Parameter $callback must be callable.' );
}
add_settings_field(
$name,
esc_html( $label ),
$callback,
$this->slug,
$this->currentSection,
$args
);
}
/**
* Add a text field to this settings page.
*
* @param string $name
* @param string $label
* @param array $args
* @param string $callback
*/
protected function addTextField( $name, $label, $args = array(), $callback = '' )
{
if ( ! $callback || ! is_callable( $callback ) ) {
$callback = array( $this, 'renderTextField' );
}
$this->addField(
$name,
$label,
$callback,
$args + array(
'label_for' => $this->slug . '-' . $name,
'name' => $name,
'attr' => array(),
)
);
}
/**
* @param string $name
* @param string $label
* @param string $caption
* @param array $args
* @param callable $callback
*/
protected function addCheckboxField( $name, $label, $caption, $args = array(), $callback = '' )
{
if ( ! $callback || ! is_callable( $callback ) ) {
$callback = array( $this, 'renderCheckboxField' );
}
$this->addField(
$name,
$label,
$callback,
$args + array(
'label_for' => $this->slug . '-' . $name,
'name' => $name,
'caption' => $caption,
'attr' => array(),
)
);
}
/**
* Add an error.
*
* @param string $code
* @param string $message
*/
protected function addError( $code, $message )
{
add_settings_error( $this->slug, $code, $message );
}
/**
* Errors for this setting.
*
* @return array {
* @type string $setting
* @type string $code
* @type string $message
* @type string $type 'error'
* }
*/
public function getErrors()
{
return get_settings_errors( $this->slug );
}
/**
* Render a setting as text field.
*
* @param array $args {
* @type string $name
* @type string $label_for
* @type array $attr
* }
*/
public function renderTextField( array $args )
{
$name = $args['name'];
$this->renderInputTag( array(
'type' => 'text',
'id' => $args['label_for'],
'class' => 'regular-text',
'name' => $this->slug . '[' . $name . ']',
'value' => $this[ $name ],
) + $args['attr'] );
}
/**
* Render a setting as checkbox.
*
* @param array $args {
* @type string $caption
* @type string $name
* @type string $label_for
* @type array $attr
* }
*/
public function renderCheckboxField( array $args )
{
$name = $args['name'];
echo '<label>';
$this->renderInputTag( array(
'type' => 'checkbox',
'id' => isset( $args['label_for'] ) ? $args['label_for'] : null,
'name' => $this->slug . '[' . $name . ']',
'value' => '1',
'checked' => $this[ $name ] ? 'checked' : null,
) + $args['attr'] );
echo ' ' . esc_html( $args['caption'] ) . '</label>';
}
/**
* Output an input tag with given HTML attributes.
*
* @param array $attr
*/
protected function renderInputTag( array $attr )
{
echo '<input';
foreach ( $attr as $k => $v ) {
if ( null !== $v ) {
printf( ' %s="%s"', $k, esc_attr( $v ) );
}
}
echo ' />';
}
/**
* Output settings page.
*/
public function renderPage()
{
if ( ! current_user_can( $this->capability ) ) {
wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
}
?>
<div class="wrap">
<h2><?php echo esc_html( $this->getPageTitle() ); ?></h2>
<form action="options.php" method="post">
<?php settings_errors( 'general' ); // “Settings saved.” message ?>
<?php settings_fields( $this->slug ); ?>
<?php do_settings_sections( $this->slug ); ?>
<?php submit_button(); ?>
</form>
</div>
<?php
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace Shy\WordPress;
abstract class Theme extends Plugin
{
public function __construct()
{
$GLOBALS['content_width'] = $this->getContentWidth();
}
/**
* @return integer
*/
abstract public function getContentWidth();
}

View File

@ -0,0 +1,20 @@
<?php
/**
* Try to load a Shy WordPress class.
*
* @param string $name
* @return boolean
*/
function shy_wordpress_autoloader( $name )
{
if ( substr( $name, 0, 14 ) !== 'Shy\\WordPress\\' ) {
return false;
}
$name = __DIR__ . '/' . str_replace( '\\', DIRECTORY_SEPARATOR, $name ) . '.php';
return is_file( $name ) && include( $name );
}
spl_autoload_register( 'shy_wordpress_autoloader' );

View File

@ -0,0 +1,40 @@
<?php
namespace Shy\WordPress\Tests;
use Shy\WordPress\HookableTrait;
/**
* Check that HookableTrait actually works.
*
* @author Philipp Cordes <pc@irgendware.net>
*/
class HookableTraitTest extends \WP_UnitTestCase
{
use HookableTrait;
public function actionMethod()
{
}
public function testWorksAsAction()
{
$this->addHookMethod( 'shywp_test_action', 'actionMethod' );
$this->assertTrue( has_action( 'shywp_test_action' ), 'Registering an action via addHookMethod() worked.' );
}
public function filterMethod( $value )
{
return $value;
}
public function testWorksAsFilter()
{
$this->addHookMethod( 'shywp_test_filter', 'filterMethod' );
$this->assertTrue( has_filter( 'shywp_test_filter' ), 'Registering a filter via addHookMethod() worked.' );
}
}

View File

@ -0,0 +1,180 @@
<?php
namespace Shy\WordPress\Tests;
use Shy\WordPress\SettingsPage;
use PHPUnit_Framework_MockObject_MockObject as MockObject;
use PHPUnit_Framework_MockObject_Builder_InvocationMocker as BuilderInvocationMocker;
class SettingsPageTest extends \WP_UnitTestCase
{
/**
* Mock a SettingsPage.
*
* @param string|null $slug
* @param string $capability
* @return SettingsPage|MockObject {
* @method BuilderInvocationMocker method(string)
* }
*/
protected function mockSettingsPage( $slug = null, $capability = 'manage_options' )
{
$builder = $this->getMockBuilder( 'Shy\WordPress\SettingsPage' )
->enableProxyingToOriginalMethods();
if ( null === $slug ) {
$builder->disableOriginalConstructor();
} else {
$builder->setConstructorArgs( array( $slug, $capability ) );
}
return $builder->getMock();
}
/**
* Test reading defaults from the settings page.
*
* @covers SettingsPage::__construct()
* @covers SettingsPage::getDefaults()
* @covers SettingsPage::offsetExists()
* @covers SettingsPage::offsetGet()
* @expectedException OutOfBoundsException
*/
public function testReading()
{
$slug = 'shywp_settingspage_test_slug_reading';
$defaults = array( 'foo' => 'bar' );
$page = $this->mockSettingsPage( $slug );
$page->method( 'getDefaults' )->willReturn( $defaults );
$this->assertEquals( $defaults, get_option( $slug ) );
$this->assertArrayHasKey( 'foo', $page );
$this->assertEquals( $defaults['foo'], $page['foo'] );
$this->assertArrayNotHasKey( 'baz', $page );
$page['baz'];
}
/**
* Test writing to the settings page.
*
* @covers SettingsPage::offsetSet()
* @expectedException OutOfBoundsException
*/
public function testWriting()
{
$slug = 'shywp_settingspage_test_slug_writing';
$defaults = array( 'foo' => 'bar' );
$page = $this->mockSettingsPage( $slug );
$page->method( 'getDefaults' )->willReturn( $defaults );
$page['foo'] = 'foo';
$this->assertEquals( 'foo', $page['foo'] );
$page['baz'] = '123';
}
/**
* Fail to remove a setting.
*
* @covers SettingPage::offsetUnset()
* @expectedException BadMethodCallException
*/
public function testRemoving()
{
$slug = 'shywp_settingspage_test_slug_removing';
$defaults = array();
$page = $this->mockSettingsPage( $slug );
$page->method( 'getDefaults' )->willReturn( $defaults );
unset( $page['baz'] );
}
/**
* Test whether the settings page can be showed.
*
* @covers SettingsPage::__construct()
* @covers SettingsPage::getParentSlug()
* @covers SettingsPage::getPageTitle()
* @covers SettingsPage::getMenuTitle()
*/
public function testRegisterPage()
{
$this->expectOutputRegex( '/&lt;page&amp;title&gt;/' );
$slug = 'shywp_settingspage_test_slug_registerpage';
$page = $this->mockSettingsPage( $slug );
$page->method( 'getParentSlug' )->willReturn( 'index.php' );
$page->method( 'getPageTitle' )->willReturn( '<page&title>' );
$page->method( 'getMenuTitle' )->willReturn( '<menu&title>' );
$page->expects( $this->once() )->method( 'registerPage' )->with();
$page->expects( $this->once() )->method( 'registerSettings' )->with();
// FIXME: Simulate display of backend.
}
/**
* @covers SettingsPage::sanitizeOptions()
*/
public function testSanitize()
{
$slug = 'shywp_settingspage_test_slug_sanitize';
$page = $this->mockSettingsPage( $slug );
$page->method( 'sanitizeOptions' )->will( $this->returnArgument( 0 ) );
$page->expects( $this->atLeastOnce() )->method( 'sanitizeOptions' );
$this->markTestIncomplete();
// FIXME: Simulate form submission
}
public function testRenderTextField()
{
$this->expectOutputRegex( '/^<input type="text"/' );
$page = $this->mockSettingsPage();
$page->renderTextField( array(
'label_for' => 'foo',
'name' => 'bar',
) );
}
public function testRenderCheckboxField()
{
$this->expectOutputRegex( '/^<label><input type="checkbox"/' );
$page = $this->mockSettingsPage();
$page->renderCheckboxField( array(
'label_for' => 'foo',
'name' => 'bar',
'caption' => 'baz',
) );
}
public function testRenderPage()
{
$this->markTestIncomplete();
$this->expectOutputRegex( '/<form action="options.php" method="post">.*&lt;3&amp;&gt;.*cryptic_teaser.*</form>/' );
$slug = 'shywp_settingspage_test_slug_renderpage';
$page = $this->mockSettingsPage( $slug, 'read' );
$page->method( 'getPageTitle' )->willReturn( '<3&>' );
$page->method( 'renderSectionTeaser' )->will( $this->returnCallback( function () use ( $teaser ) {
echo 'cryptic_teaser';
} ) );
// FIXME: Simulate view of the settings page
$page->renderPage();
}
}

View File

@ -0,0 +1,20 @@
<?php
/**
* Try to load a Shy WordPress test class.
*
* @param string $name
* @return boolean
*/
function shy_wordpress_tests_autoloader( $name )
{
if ( substr( $name, 0, 20 ) !== 'Shy\\WordPress\\Tests\\' ) {
return false;
}
$name = __DIR__ . '/' . str_replace( '\\', DIRECTORY_SEPARATOR, $name ) . '.php';
return is_file( $name ) && include( $name );
}
spl_autoload_register( 'shy_wordpress_tests_autoloader' );

View File

@ -0,0 +1,14 @@
<?php
/**
* PHPUnit bootstrap file
*
* Variant of the one from github.com/tierra/wordpress-plugins-tests
*/
require_once '../src/autoloader.php';
require_once 'autoloader.php';
require_once ( getenv( 'WP_DEVELOP_DIR' ) ?: '../../../..' )
. '/tests/phpunit/includes/bootstrap.php';

0
core/VersionChecker.php Normal file
View File

14
core/fileloader.php Normal file
View File

@ -0,0 +1,14 @@
<?php
require_once (ABSPATH . '/wp-admin/includes/plugin.php');
require_once (ABSPATH . '/wp-admin/includes/class-wp-filesystem-base.php');
require_once (ABSPATH . '/wp-admin/includes/class-wp-filesystem-direct.php');
require_once (BDP_LV_PLUGIN_DIR . '/lib/ics-parser/Event.php');
require_once (BDP_LV_PLUGIN_DIR . '/lib/ics-parser/ICal.php');
require_once (BDP_LV_PLUGIN_DIR . '/modules/seo/seo.php');
require_once (BDP_LV_PLUGIN_DIR . '/modules/calendar/calendar.php');
require_once (ABSPATH . '/wp-includes/pluggable.php');
require_once (BDP_LV_PLUGIN_DIR . '/core/frontend-functions.php');
require_once (BDP_LV_PLUGIN_DIR . '/modules/security/security.php');

0
core/filters.php Normal file
View File

179
core/frontend-functions.php Normal file
View File

@ -0,0 +1,179 @@
<?php
add_action('admin_enqueue_scripts', 'bdp_update_dashboard_style');
add_action('login_enqueue_scripts', 'bdp_update_login_style');
function bdp_update_login_style() {
$css = file_get_contents(BDP_LV_PLUGIN_DIR . 'assets/dashboard.style.css.tpl');
echo str_replace('%%BDP_LV_PLUGIN_URL%%', BDP_LV_PLUGIN_URL, $css);
}
function bdp_update_dashboard_style() {
wp_enqueue_style('custom-dashboard-styles', BDP_LV_PLUGIN_URL . '/assets/wordpress-bdp.css');
wp_enqueue_style('custom-calendar-styles', BDP_LV_PLUGIN_URL . '/assets/calendar.css');
wp_enqueue_style('custom-security-styles', BDP_LV_PLUGIN_URL . '/assets/security.css');
}
function bdp_add_menu_security() {
$moduleLoad = get_admin_url() . 'admin.php?page=' . BDP_LV_PLUGIN_SLUG . '/modules/index.php&loadmodule=';
add_menu_page(
'Sicherheit',
'Erweiterte<br />Sicherheit',
'manage_options',
'site-health.php',
'',
'dashicons-admin-network',
5
);
https://wordpress.local.development.contelli.de/wp-admin/admin.php?page=limit-login-attempts
add_submenu_page('site-health.php',
'Login-Kontrolle',
'Login-Kontrolle',
'manage_options',
get_admin_url() . 'admin.php?page=limit-login-attempts'
);
}
function bdp_add_menu_contents() {
add_menu_page(
'Beiträge',
'Inhalte',
'edit_posts',
'edit.php',
'',
'dashicons-format-aside',
4
);
add_submenu_page('edit.php',
'media',
'Medienverwaltung',
'edit_posts',
'upload.php'
);
add_submenu_page('edit.php',
'media',
'Statische Seiten',
'edit_posts',
'edit.php?post_type=page'
);
add_submenu_page('edit.php',
'comments',
'Kommentare',
'edit_posts',
'edit-comments.php'
);
}
function bdp_add_menu_mein_lv() {
$location = BDP_LV_PLUGIN_DIR . '/modules/';
$mainSlug = $location . 'index.php';
$moduleLoad = get_admin_url() . 'admin.php?page=' . BDP_LV_PLUGIN_SLUG . '/modules/index.php&loadmodule=';
add_menu_page(
'Mein BDP',
'BdP',
'manage_options',
$mainSlug,
'',
BDP_LV_PLUGIN_URL . '/icon.png',
3
);
add_submenu_page($mainSlug,
'calendar_settings',
'Kalender-Einstellungen',
'manage_options',
$moduleLoad . 'calendar'
);
add_submenu_page($mainSlug,
'calendar_settings',
'Über',
'manage_options',
$moduleLoad . 'about'
);
}
function bdp_add_menu_setup() {
add_menu_page(
'Allgemeine Einstellungen',
'Webseiten-Setup',
'manage_options',
'users.php',
'',
'dashicons-admin-generic',
6
);
add_submenu_page('users.php',
'Allgemeine Einstellungen',
'Allgemeine Einstellungen',
'manage_options',
'options-general.php'
);
add_submenu_page('users.php',
'Design-Einstellungen',
'Design',
'manage_options',
'customize.php?return=/wp-admin/'
);
add_submenu_page('users.php',
'plugins',
'Erweiterungen',
'manage_options',
'plugins.php'
);
add_submenu_page('users.php',
'themes',
'Designs',
'manage_options',
'themes.php'
);
}
function bdp_cleanup_menu()
{
global $submenu;
remove_menu_page('edit-comments.php');
remove_menu_page('edit.php');
remove_menu_page('edit.php?post_type=page');
remove_menu_page('upload.php');
remove_menu_page('themes.php');
remove_menu_page('plugins.php');
remove_menu_page('options-general.php');
remove_menu_page('users.php');
remove_menu_page('tools.php');
bdp_add_menu_contents();
bdp_add_menu_setup();
bdp_add_menu_security();
remove_submenu_page('users.php','user-new.php');
remove_submenu_page('users.php','profile.php');
remove_submenu_page('edit.php','post-new.php');
remove_submenu_page('edit.php','edit-tags.php?taxonomy=category');
remove_submenu_page('edit.php','edit-tags.php?taxonomy=post_tag');
}
function bdp_create_menu_structure()
{
add_action('admin_menu', 'bdp_cleanup_menu');
bdp_add_menu_mein_lv();
}

BIN
holz.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

51
icon.svg Normal file
View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="2000px" height="2000px" viewBox="0 0 2000 2000" style="enable-background:new 0 0 2000 2000;" xml:space="preserve">
<g>
<path style="fill:#1D4899;" d="M0,1000.023C0,447.935,447.769,0,1000.262,0C1552.209,0,2000,447.935,2000,1000.023
c0,552.054-447.791,999.977-999.738,999.977C447.769,2000,0,1552.077,0,1000.023"/>
<path style="fill:#FFCB04;" d="M1000.214,1797.409l-167.939-206.695c36.529-50.487,56.122-90.156,71.065-144.273
c7.235-25.315,13.948-69.101,13.45-78.887h-16.533c-6.215,60.333-39.708,148.484-85.014,204.097c0,0-65.468-78.839-73.225-88.614
c12.43-9.288,66.464-77.843,68.552-104.699c0.546-8.743-34.537-6.157-34.537-54.604c0-63.939,46.397-41.211,45.899-78.341
c-0.546-30.926-25.761-54.142-58.756-54.142c-30.979,0-43.835,34.544-42.791,56.229c1.542,37.082,1.044,51.033,1.044,55.113
c0,28.376-12.904,81.948-52.066,81.948c-17.506,0-45.852-46.858-257.697-304.064l248.921-297.99
c154.11,60.855,243.251,273.221,243.251,423.248v66.467h13.948c2.562-26.312,0.498-102.564,0.498-102.564
c-6.713-171.653-93.767-346.402-230.348-421.647l312.277-380.412l311.779,380.412c-132.952,80.382-227.762,264.407-226.742,433.462
c0,0-3.605,56.692,1.565,90.75h14.446c-4.128-37.629-1.044-78.887-1.044-78.887c2.538-155.129,76.237-343.271,242.753-411.327
l245.292,298.489c-211.799,256.661-243.75,304.064-261.326,304.064c-39.115,0-48.438-53.572-48.438-81.402
c0-4.626-0.498-18.577,1.044-55.659c1.044-21.14-11.86-56.229-42.744-56.229c-32.995,0-58.257,23.216-58.755,54.64
c-0.546,37.083,45.875,14.401,45.875,77.843c0,48.945-35.059,45.861-34.561,54.604c2.04,26.856,56.17,95.411,68.6,104.699
c-7.307,9.775-74.245,88.614-74.245,88.614c-43.289-58.233-70.639-136.575-77.85-204.097h-14.92c0,0,3.083,38.138,10.318,63.903
c14.397,54.153,29.888,99.967,66.464,159.257"/>
<path style="fill:#1D4899;" d="M832.772,1294.835h334.456c14.943,0,26.804,10.818,26.804,24.733
c0,13.939-11.86,24.758-26.804,24.758H832.772c-14.968,0-26.804-10.818-26.804-24.758
C805.969,1305.653,817.805,1294.835,832.772,1294.835"/>
<path style="fill:#1D4899;" d="M1000.214,425.277l262.347,318.536c-128.351,106.183-195.384,260.291-198.966,400.01
c0,0-4.128,81.426-1.542,128.33h-61.839"/>
<path style="fill:#1D4899;" d="M1000.214,1367.554h64.425c8.23,79.385,23.673,147.44,64.424,225.225l-128.849,154.689"/>
<path style="fill:#1D4899;" d="M663.718,828.94l-207.221,251.536c152.569,183.979,169.103,218.036,188.149,218.036
c9.773,0,16.486-15.493,16.486-25.221c0-45.908-53.655-102.611-53.655-152.601c0-47.451,44.38-87.144,87.147-87.144
c110.798,0,164.88,183.516,161.299,238.653h17.03c3.037-21.638,2.04-67.013,1.542-77.843
C867.76,1071.722,775.037,856.248,663.718,828.94"/>
<path style="fill:#1D4899;" d="M1336.33,828.94l207.103,251.536c-152.521,183.979-171.616,221.12-190.688,221.12
c-10.224,0-13.9-16.489-13.9-26.264c0-45.933,53.607-104.652,53.607-154.642c0-47.451-43.835-87.144-87.101-87.144
c-110.228,0-166.469,183.018-161.25,238.653h-17.031c-3.132-21.638-1.59-82.445-1.044-93.276
C1133.261,1046.977,1225.011,856.248,1336.33,828.94"/>
<path style="fill:#1D4899;" d="M853.955,1367.554h15.441c-2.586,38.684-38.664,135.044-49.457,130.418
c-11.409-3.618-11.409-7.248-12.382-14.438C806.016,1470.07,837.92,1410.805,853.955,1367.554"/>
<path style="fill:#1D4899;" d="M1148.157,1367.554h-15.537c3.132,38.684,38.19,131.912,49.552,129.92
c12.358-3.12,10.816-8.826,10.816-15.54C1191.945,1468.6,1164.643,1410.805,1148.157,1367.554"/>
<path style="fill:#FFCB04;" d="M812.61,169.624c77.328,0,145.855,22.741,187.604,76.313
c41.25-53.572,109.801-76.313,187.059-76.313c62.882,0,110.821,22.741,147.967,45.921
c47.938,29.894,104.061,104.629,114.877,190.729c3.132,26.785,0,69.017,0,69.017c-1.518,45.908-38.664,128.354-77.28,193.314
c-2.063,3.132,39.66-20.629,83.448-27.272c18.549-2.622,55.126-3.642,59.253-3.642c144.884,0,269.604,110.347,269.604,262.366
c0,61.876-20.162,140.217-74.742,180.42c50.477,44.283,74.742,112.387,74.742,187.11c0,137.606-109.303,256.696-257.198,260.326
c-26.852,1.044-88.146,7.687-196.879-75.803l302.553-371.634L999.716,315.523L366.36,1080.477l302.457,371.634
c-95.331,83.489-170.026,76.301-196.831,75.803c-138.621-1.044-256.653-122.72-256.653-260.326
c0-74.724,24.219-142.827,74.197-187.11c-54.58-40.203-74.197-118.544-74.197-180.42c0-152.02,124.247-262.366,269.012-262.366
c4.602,0,40.752,1.02,59.254,3.642c43.835,6.644,86.057,30.404,84.017,27.272c-39.186-64.96-76.261-147.406-77.802-193.314
c0,0-3.084-42.231,0-69.017c10.816-86.1,67.483-160.835,115.446-190.729C701.836,192.365,750.273,169.624,812.61,169.624"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

318
lib/ics-parser/Event.php Normal file
View File

@ -0,0 +1,318 @@
<?php
ini_set('display_errors', '1');
ini_set('date.timezone', 'Europe/Berlin');
class Event
{
// phpcs:disable Generic.Arrays.DisallowLongArraySyntax
const HTML_TEMPLATE = '<p>%s: %s</p>';
public $category;
public $start = '';
public $startInt = 0;
public $end = '';
public $endInt = 0;
public $wholeDay = false;
/**
* https://www.kanzaki.com/docs/ical/summary.html
*
* @var string
*/
public $summary;
/**
* https://www.kanzaki.com/docs/ical/dtstart.html
*
* @var string
*/
public $dtstart;
/**
* https://www.kanzaki.com/docs/ical/dtend.html
*
* @var string
*/
public $dtend;
/**
* https://www.kanzaki.com/docs/ical/duration.html
*
* @var string|null
*/
public $duration;
/**
* https://www.kanzaki.com/docs/ical/dtstamp.html
*
* @var string
*/
public $dtstamp;
/**
* When the event starts, represented as a timezone-adjusted string
*
* @var string
*/
public $dtstart_tz;
/**
* When the event ends, represented as a timezone-adjusted string
*
* @var string
*/
public $dtend_tz;
/**
* https://www.kanzaki.com/docs/ical/uid.html
*
* @var string
*/
public $uid;
/**
* https://www.kanzaki.com/docs/ical/created.html
*
* @var string
*/
public $created;
/**
* https://www.kanzaki.com/docs/ical/lastModified.html
*
* @var string
*/
public $last_modified;
/**
* https://www.kanzaki.com/docs/ical/description.html
*
* @var string|null
*/
public $description;
/**
* https://www.kanzaki.com/docs/ical/location.html
*
* @var string|null
*/
public $location;
/**
* https://www.kanzaki.com/docs/ical/sequence.html
*
* @var string
*/
public $sequence;
/**
* https://www.kanzaki.com/docs/ical/status.html
*
* @var string
*/
public $status;
/**
* https://www.kanzaki.com/docs/ical/transp.html
*
* @var string
*/
public $transp;
/**
* https://www.kanzaki.com/docs/ical/organizer.html
*
* @var string
*/
public $organizer;
/**
* https://www.kanzaki.com/docs/ical/attendee.html
*
* @var string
*/
public $attendee;
/**
* Manage additional properties
*
* @var array<string, mixed>
*/
public $additionalProperties = array();
/**
* Creates the Event object
*
* @param array $data
* @return void
*/
public function __construct(array $data = array())
{
foreach ($data as $key => $value) {
if ($key == 'DTSTART_array' || $key == 'DTEND_array') {
$dateString = $value[1];
$dateTime = \DateTime::createFromFormat('Ymd\THis', $dateString);
if (false === $dateTime) {
$this->wholeDay = true;
$dateTime = \DateTime::createFromFormat('Ymd', $dateString);
}
$timeZone = 'Europe/Berlin';
if (isset($value[0]['TZID'])) {
$timeZone = $value[0]['TZID'];
}
$dateTime->setTimezone(new \DateTimeZone($timeZone));
if ($key == 'DTSTART_array') {
$this->start = $dateTime->format('d.m.Y H:i:s');
$this->startInt = $dateTime->getTimestamp();
} else {
$this->end = $dateTime->format('d.m.Y H:i:s');
$this->endInt = $dateTime->getTimestamp();
}
} else {
$variable = self::snakeCase($key);
if (property_exists($this, $variable)) {
$this->{$variable} = $this->prepareData($value);
} elseif ($variable == 'categories') {
$this->category = $value;
} else {
$this->additionalProperties[$variable] = $this->prepareData($value);
}
}
}
}
/**
* Magic getter method
*
* @param string $additionalPropertyName
* @return mixed
*/
public function __get($additionalPropertyName)
{
if (array_key_exists($additionalPropertyName, $this->additionalProperties)) {
return $this->additionalProperties[$additionalPropertyName];
}
return null;
}
/**
* Magic isset method
*
* @param string $name
* @return boolean
*/
public function __isset($name)
{
return is_null($this->$name) === false;
}
/**
* Prepares the data for output
*
* @param mixed $value
* @return mixed
*/
protected function prepareData($value)
{
if (is_string($value)) {
return stripslashes(trim(str_replace('\n', "\n", $value)));
}
if (is_array($value)) {
return array_map(function ($value) {
return $this->prepareData($value);
}, $value);
}
return $value;
}
public function getEventTime() {
$dateTime = explode(' ', $this->start);
if ($this->wholeDay) {
return null;
}
if (isset($dateTime[1])) {
$time = explode(':', $dateTime[1]);
return $time[0] . ':' . $time[1] . ' Uhr';
}
return null;
}
/**
* Returns Event data excluding anything blank
* within an HTML template
*
* @param string $html HTML template to use
* @return string
*/
public function printData($html = self::HTML_TEMPLATE)
{
$data = array(
'SUMMARY' => $this->summary,
'start' => $this->start,
'end' => $this->end,
'DTEND' => $this->dtend,
'DTSTART_TZ' => $this->dtstart_tz,
'DTEND_TZ' => $this->dtend_tz,
'DURATION' => $this->duration,
'DTSTAMP' => $this->dtstamp,
'UID' => $this->uid,
'CREATED' => $this->created,
'LAST-MODIFIED' => $this->last_modified,
'DESCRIPTION' => $this->description,
'LOCATION' => $this->location,
'SEQUENCE' => $this->sequence,
'STATUS' => $this->status,
'TRANSP' => $this->transp,
'ORGANISER' => $this->organizer,
'ATTENDEE(S)' => $this->attendee,
'CATEGORIES' => $this->category,
);
// Remove any blank values
$data = array_filter($data);
$output = '';
foreach ($data as $key => $value) {
$output .= sprintf($html, $key, $value);
}
return $output;
}
/**
* Converts the given input to snake_case
*
* @param string $input
* @param string $glue
* @param string $separator
* @return string
*/
protected static function snakeCase($input, $glue = '_', $separator = '-')
{
$inputSplit = preg_split('/(?<=[a-z])(?=[A-Z])/x', $input);
if ($inputSplit === false) {
return $input;
}
$inputSplit = implode($glue, $inputSplit);
$inputSplit = str_replace($separator, $glue, $inputSplit);
return strtolower($inputSplit);
}
}

2731
lib/ics-parser/ICal.php Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,36 @@
<div id="wpbody-content">
<h1>Über dieses Plugin</h1>
<form method="post" action="admin.php?page=bdp-kompass%2Fmodules%2Findex.php&loadmodule=security">
<div class="bdp_security_outer">
<fieldset class="bdp_security_inner">
<p>
Das Plugin Kompass (<span style="font-weight: bold;">Komp</span>onente zur<span style="font-weight: bold;">A</span>dministration, <span style="font-weight: bold;">S</span>icherung und <span style="font-weight: bold;">S</span>ynchronisierung) wurde entwickelt, um euch bei der Administration eurer Webseite zu helfen.<br />
Neben einer Vereinfachung der Navigation stellt das Plugin Sicherheitskomponenten bereit und installiert Plugins, die zur Absicherung eurer Webseite oder der Optimierung empfohlen werden.<br />
Die Plugin-Empfehlung und Optimierung der Einstellungen erfolgt auf Datenbasis, die vom LB IT des LV Sachsen verwaltwet wird.<br />
Auch bietet das Plugin Schnittstellen zur Integration und Darstellung von ausgesuchten externen Inhalten (eurem Stammes-Kalender im Wiki, der Veranstaltungsanmeldung auzf Mareike, ...) auf eurer Webseite.
</p>
<p>
Dieses Plugin wurde speziell für den Lanbdesverband Sachsen e.V. im Bund der Pfadfinderinnen und Pfadfinder e.V. ("BdP") entwickelt.<br />
Die Nutzung außerhalb des BdP bedarf der ausrücklichen Zustimmung des Authors.<br /><br />
Dies Plugin wurde speziell andie Anforderungen im LV Sachsen angepasst, innerhalb anderer Landesverbände kann es zu Kompatibilitätsproblemen kommen.
Sollte dies der Fall sein, so kontaktiert bitte den Author.
</p>
<p>
Die Urheberrechte aller extern nachgeladenen Plugins und Themes liegen weiterhin bei den Authoren der jeweiligen Komponenten.
</p>
<p><span style="font-weight: bold;">Informationen zum Author:</span><br />
Thomas Günther, Aufbaugruppe Wilde Möhre im <a href="https://www.sachsen.pfadfinden.de/kontakt/gruppen-vor-ort/" target="_blank">LV Sachsen</a><br />
<a href="mailto:thomas.guenther@pfadfinden.de">E-Mail</a><br />
<a href="https://t.me/thomas_8611" target="_blank">Telegram</a>
</p>
</fieldset>
</div>
</form>

View File

@ -0,0 +1,13 @@
<?php
require_once dirname(__FILE__) . '/../../../../../wp-config.php';
require_once dirname(__FILE__) . '/../../../../../wp-includes/option.php';
require_once dirname(__FILE__) . '/../../../../../wp-includes/plugin.php';
require_once dirname(__FILE__) . '/../../../../../wp-includes/load.php';
require_once dirname(__FILE__) . '/../../../../../wp-includes/cache.php';
require_once dirname(__FILE__) . '/../../lib/ics-parser/Event.php';
require_once dirname(__FILE__) . '/../../lib/ics-parser/ICal.php';
require_once 'calendar.php';
$calendar = new Calendar();
echo $calendar->show();

View File

@ -0,0 +1,22 @@
// Funktion zum Laden des Kalenders über AJAX
function loadCalendar(month, year) {
// Erstelle ein XMLHttpRequest-Objekt
var xhr = new XMLHttpRequest();
// Definiere die URL zum Laden des Kalenders (angepasst an deine Bedürfnisse)
var url = '/wp-content/plugins/bdp-kompass/modules/calendar/ajax-calendar.php?month=' + month + '&year=' + year;
// Öffne eine GET-Anfrage
xhr.open('GET', url, true);
// Setze die Callback-Funktion für die Antwort
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
// Aktualisiere den Inhalt des Container-Divs mit der Kalenderantwort
document.getElementById('calendarContainer').innerHTML = xhr.responseText;
}
};
// Sende die Anfrage
xhr.send();
}

View File

@ -0,0 +1,217 @@
/*******************************Calendar Top Navigation*********************************/
div#calendar{
margin:0px auto;
padding:0px;
width: 100%;
font-family:Helvetica, "Times New Roman", Times, serif;
}
div#calendar div.box{
position:relative;
top:0px;
left:0px;
width:100%;
height:40px;
background-color: #ffcb04;
}
div#calendar div.header{
line-height:40px;
vertical-align:middle;
position:absolute;
left:11px;
top:0px;
width:100%;
height:40px;
text-align:center;
}
div#calendar div.header a.prev,div#calendar div.header a.next{
position:absolute;
top:0px;
padding-right: 20px;
height: 17px;
display:block;
cursor:pointer;
text-decoration:none;
color:#3163bd;
font-weight: bold;
}
div#calendar div.header span.title{
color:#3163bd;
font-weight: bold;
font-size:18px;
}
div#calendar div.header a.prev{
left:0px;
}
div#calendar div.header a.next{
right:0px;
}
/*******************************Calendar Content Cells*********************************/
div#calendar div.box-content{
border-top:none;
width: 100%;
}
div#calendar ul.label{
float:left;
margin: 0px;
padding: 0px;
margin-top:5px;
margin-left: 5px;
width: 100%;
}
div#calendar ul.label li{
margin:0px;
padding:0px;
float:left;
list-style-type:none;
height:40px;
line-height:40px;
vertical-align:middle;
text-align:center;
color:#000;
font-size: 15px;
background-color: transparent;
}
div#calendar ul.dates{
float:left;
margin: 0px;
padding: 0px;
margin-left: 5px;
margin-bottom: 5px;
}
.bdp_cal_day
{
padding-left: 5px;
color: #a0a0a0;
}
bdp_cal_day td {
min-height: 100px;
}
.bdp_event_table {
width:95%;
}
.bdp_cal_day ul {
padding: 0;
}
.bdp_cal_day li {
list-style-type: none;
width:95%;
font-size: 8pt;
font-weight: bold;
padding: 2px;
margin-bottom: 2px;
}
.bdp_cal_event_red,
.bdp_cal_event_yellow,
.bdp_cal_event_blue,
.bdp_cal_event_green,
.bdp_cal_event_grey,
.bdp_cal_event_fuchsia,
.bdp_cal_event_orange
{
padding: 2px 4px;
border-radius: 5px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.bdp_cal_event_blue {
background-color: #1e88e5;
color: #FFFFFF;
}
.bdp_cal_event_green {
background-color: #00d084;
color: #000000;
}
.bdp_cal_event_red
{
.bdp_cal_event_entry;
background-color: #e91e63;
color: #ffffff;
}
.bdp_cal_event_yellow
{
.bdp_cal_event_entry;
background-color: #eeee88;
color: #000000;
}
.bdp_cal_event_orange
{
.bdp_cal_event_entry;
background-color: #ffa747;
color: #000000;
}
.bdp_cal_event_grey
{
.bdp_cal_event_entry;
background-color: #D5D5D5;
color: #000000;
}
.bdp_cal_event_fuchsia
{
.bdp_cal_event_entry;
background-color: #FF6EFF;
color: #000000;
}
/** overall width = width+padding-right**/
div#calendar ul.dates li{
margin:0px;
padding:0px;
padding-left: 2px;
padding-top: 10px;
vertical-align:bottom;
float:left;
list-style-type:none;
width:15%;
height:100px;
font-size:12pt;
background-color: #fff;
color:#000;
border-style: solid;
border-width:1px;
border-color: #add8e6;
}
:focus{
outline:none;
}
div.clear{
clear:both;
}

View File

@ -0,0 +1,6 @@
<?php
add_filter('the_content', ['Calendar', 'printCalendar']);
wp_enqueue_style('bdp_calendar_css', BDP_LV_PLUGIN_URL . '/modules/calendar/assets/calendar.css');
wp_enqueue_script( 'loadCalendar', BDP_LV_PLUGIN_URL . '/modules/calendar/assets/ajaxscript.js');
require_once dirname(__FILE__) . '/classes/Calendar.class.php';

View File

@ -0,0 +1,315 @@
<?php
class Calendar
{
public $ical;
private $categories = [];
public static function setup()
{
$pageName = 'Kalender';
$page_exists = get_page_by_path($pageName, OBJECT, 'page');
// Wenn die Seite nicht existiert, erstelle sie
if (!$page_exists) {
$page_id = wp_insert_post(array(
'post_title' => $pageName,
'post_content' => '{{calendar}}',
'post_status' => 'publish',
'post_type' => 'page',
));
update_option('bdp_calendar_source_url', 'https://wiki.sachsen.pfadfinden.de/rest/calendar-services/1.0/calendar/export/subcalendar/private/ff69f5a689391ac0d7f78a70189cfde7c48cb923.ics');
}
}
public static function printCalendar($content) {
// Der zu ersetzende String
$original_string = '{{calendar}}';
$calendar = new Calendar();
// Der Ersatzstring
$replacement_string = $calendar->show();
// Ersetze den Originalstring durch den Ersatzstring im Seiteninhalt
$content = str_replace($original_string, $replacement_string, $content);
return $content;
}
/**
* Constructor
*/
public function __construct()
{
$categories = get_option('bdp_calendar_categories', null);
if (null !== $categories) {
$categories = json_decode($categories, true);
} else {
$categories = [
'yellow' => 'Meute',
'blue' => 'Sippe',
'red' => 'Runde',
'green' => 'StaFü',
'fuchsia' => '',
'orange' => ''
];
}
foreach ($categories as $color => $keyname) {
$this->categories[$keyname] = $color;
}
$calendarUrl = get_option('bdp_calendar_source_url', 'https://wiki.sachsen.pfadfinden.de/rest/calendar-services/1.0/calendar/export/subcalendar/private/ff69f5a689391ac0d7f78a70189cfde7c48cb923.ics');
$this->ical = new \ICal('', array(
'defaultSpan' => 2, // Default value
'defaultTimeZone' => '',
'defaultWeekStart' => 'MO', // Default value
'disableCharacterReplacement' => false, // Default value
'filterDaysAfter' => null, // Default value
'filterDaysBefore' => null, // Default value
'httpUserAgent' => null, // Default value
'skipRecurrence' => false, // Default value
));
$this->ical->initUrl($calendarUrl);
$this->ical->events();
$this->naviHref = htmlentities($_SERVER['PHP_SELF']);
}
/********************* PROPERTY ********************/
private $dayLabels = array("Mon", "Die", "Mit", "Don", "Fre", "Sam", "Son");
private $monthLabels = ['', 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
private $currentYear = 0;
private $currentMonth = 0;
private $currentDay = 0;
private $currentDate = null;
private $daysInMonth = 0;
private $naviHref = null;
/********************* PUBLIC **********************/
/**
* print out the calendar
*/
public function show()
{
$year = null;
$month = null;
if (null == $year && isset($_GET['year'])) {
$year = $_GET['year'];
} else if (null == $year) {
$year = date("Y", time());
}
if (null == $month && isset($_GET['month'])) {
$month = $_GET['month'];
} else if (null == $month) {
$month = date("m", time());
}
$this->currentYear = $year;
$this->currentMonth = $month;
$this->daysInMonth = $this->_daysInMonth($month, $year);
$content = ' <div id="calendarContainer"><div id="calendar">' .
'<div class="box">' .
$this->_createNavi() .
'</div>' .
'<div class="box-content">' .
'<table style=" border-collapse: collapse; border-spacing: 0; table-layout: fixed;width: 100%;">
<tr>' . $this->_createLabels() . '</tr>';
$weeksInMonth = $this->_weeksInMonth($month, $year);
// Create weeks in a month
for ($i = 0; $i < $weeksInMonth; $i++) {
//Create days in a week
for ($j = 1; $j <= 7; $j++) {
if ($j % 7 == 1) {
$content .= '</tr><tr class="bdp_cal_day">';
}
$content .= $this->_showDay($i * 7 + $j);
}
}
$content .= '</table></div>';
return $content;
}
private function getCssClass($category)
{
$cssClass = 'bdp_cal_event_' . ($this->categories[$category] ?? 'grey');
return $cssClass;
}
private function getEvent($date)
{
$eventString = '<ul>';
#echo '<pre>';
foreach ($this->ical->filterByDate($date) as $curEvent) {
$time = $curEvent->getEventTime() ?? 'Ganztags';
#print_r($curEvent);
$eventString .= '<li class="' . $this->getCssClass($curEvent->category) . '">' .
$time . ':<br />' .
$curEvent->summary . '</li>';
}
return $eventString;
}
/********************* PRIVATE **********************/
/**
* create the li element for ul
*/
private function _showDay($cellNumber)
{
if ($this->currentDay == 0) {
$firstDayOfTheWeek = date('N', strtotime($this->currentYear . '-' . $this->currentMonth . '-01'));
if (intval($cellNumber) == intval($firstDayOfTheWeek)) {
$this->currentDay = 1;
}
}
if (($this->currentDay != 0) && ($this->currentDay <= $this->daysInMonth)) {
$date =
str_pad($this->currentDay, 2, '0', STR_PAD_LEFT) . '.' .
str_pad($this->currentMonth, 2, '0', STR_PAD_LEFT) . '.' .
$this->currentYear;
$this->currentDate = date('Y-m-d', strtotime($this->currentYear . '-' . $this->currentMonth . '-' . ($this->currentDay)));
$cellContent = '<span class="bdp_cal_day">' . $this->currentDay . '</span>' . $this->getEvent($date);
$this->currentDay++;
} else {
$this->currentDate = null;
$cellContent = null;
}
return '<td style="padding-top: 5px; border-color: #a0a0a0; height: 120px; border-style: solid; border-width:1px; vertical-align: top;">' . $cellContent . '</td>';
}
/**
* create navigation
*/
private function _createNavi()
{
$nextMonth = $this->currentMonth == 12 ? 1 : intval($this->currentMonth) + 1;
$nextYear = $this->currentMonth == 12 ? intval($this->currentYear) + 1 : $this->currentYear;
$preMonth = $this->currentMonth == 1 ? 12 : intval($this->currentMonth) - 1;
$preYear = $this->currentMonth == 1 ? intval($this->currentYear) - 1 : $this->currentYear;
return
'<div class="header">' .
'<a class="prev" href="javascript:void(0);" onclick="loadCalendar(' . $preMonth . ',' . $preYear . ');"><< Vorheriger Monat</a>' .
'<span class="title">' . $this->monthLabels[(int)date('m', strtotime($this->currentYear . '-' . $this->currentMonth . '-1'))] . ' ' . date('Y', strtotime($this->currentYear . '-' . $this->currentMonth . '-1')) . '</span>' .
'<a class="next" href="javascript:void(0);" onclick="loadCalendar(' . $nextMonth . ',' . $nextYear . ');">Nächster Monat >></a>' .
'</div>';
}
/**
* create calendar week labels
*/
private function _createLabels()
{
$content = '';
foreach ($this->dayLabels as $index => $label) {
$content .= '<td style="max-width: 14.287%;">' . $label . '</td>';
}
return $content;
}
/**
* calculate number of weeks in a particular month
*/
private function _weeksInMonth($month = null, $year = null)
{
if (null == ($year)) {
$year = date("Y", time());
}
if (null == ($month)) {
$month = date("m", time());
}
// find number of days in this month
$daysInMonths = $this->_daysInMonth($month, $year);
$numOfweeks = ($daysInMonths % 7 == 0 ? 0 : 1) + intval($daysInMonths / 7);
$monthEndingDay = date('N', strtotime($year . '-' . $month . '-' . $daysInMonths));
$monthStartDay = date('N', strtotime($year . '-' . $month . '-01'));
if ($monthEndingDay < $monthStartDay) {
$numOfweeks++;
}
return $numOfweeks;
}
/**
* calculate number of days in a particular month
*/
private function _daysInMonth($month = null, $year = null)
{
if (null == ($year))
$year = date("Y", time());
if (null == ($month))
$month = date("m", time());
return date('t', strtotime($year . '-' . $month . '-01'));
}
}

View File

@ -0,0 +1,91 @@
<?php
echo '<div id="wpbody-content">';
echo '<h1>Kalender-Einstellungen</h1>';
if (isset($_POST['submit'])) {
echo '<div id="bdp_success">Die Einstellungen wurden gespeichert.</div>';
update_option('bdp_calendar_categories', json_encode($_POST['category']));
update_option('bdp_calendar_source_url', $_POST['ical_url']);
}
$categories = get_option('bdp_calendar_categories', null);
if (null !== $categories) {
$categories = json_decode($categories, true);
} else {
$categories = [
'yellow' => 'Meute',
'blue' => 'Sippe',
'red' => 'Runde',
'green' => 'Stammesführung',
'fuchsia' => '',
'orange' => ''
];
}
?>
<form method="post" action="admin.php?page=bdp-kompass%2Fmodules%2Findex.php&loadmodule=calendar">
<div class="bdp_cal_outer">
<fieldset class="bdp_cal_inner">
<legend>Datenabfrage</legend>
<table>
<tr style="vertical-align: top;">
<td>Kalender-URL:</td>
<td><input class="long_text" type="text" name="ical_url" id="ical_url" required
value = "<?php echo get_option('bdp_calendar_source_url', ''); ?>"
><br />
<label style="font-weight: normal; color: #a0a0a0; font-style: italic">
Bitte gib hier die URL zur .ics - Datei eures Kalenbders im Wiki ein.
</label>
</td>
</tr>
</table>
</fieldset>
<fieldset class="bdp_cal_inner">
<legend>Labels</legend>
<table>
<tr>
<td>Gelb:</td>
<td><input type="text" name="category[yellow]" value="<?php echo $categories['yellow']; ?>" /></td>
<td class="bdp_cal_event_yellow"></td>
</tr>
<tr>
<td>Blau:</td>
<td><input type="text" name="category[blue]" value="<?php echo $categories['blue']; ?>" /></td>
<td class="bdp_cal_event_blue"></td>
</tr>
<tr>
<td>Rot:</td>
<td><input type="text" name="category[red]" value="<?php echo $categories['red']; ?>" /></td>
<td class="bdp_cal_event_red"></td>
</tr>
<tr>
<td>Grün:</td>
<td><input type="text" name="category[green]" value="<?php echo $categories['green']; ?>" /></td>
<td class="bdp_cal_event_green"></td>
</tr>
<tr>
<td>Fuchsia:</td>
<td><input type="text" name="category[fuchsia]" value="<?php echo $categories['fuchsia']; ?>" /></td>
<td class="bdp_cal_event_fuchsia"></td>
</tr>
<tr>
<td>Orange:</td>
<td><input type="text" name="category[orange]" value="<?php echo $categories['orange']; ?>" /></td>
<td class="bdp_cal_event_orange"></td>
</tr>
<tr>
<td>Grau:</td>
<td>Standard</td>
<td class="bdp_cal_event_grey"></td>
</tr>
</table>
</fieldset>
<input class="bdp_submit" type="submit" name="submit" value="Einstellungen speichern">
</form>
</div>
</div>

View File

@ -0,0 +1,55 @@
<?php
declare(strict_types=1);
namespace BDP_LV_Sachsen\WordpressHelper\DependenCyChecker;
class DependencyChecker
{
const depenedencies = ['pfadfinden-theme-updater' ];
public static function init() : void
{
return;
foreach(self::depenedencies as $class) {
$file = ABSPATH . '/wp-content/plugins/bdp-kompass/plugins/' . $class;
system('cp -r ' . $file . '* ' . ABSPATH . 'wp-content/plugins/' . $class);
$plugin = 'pfadfinden-theme-updater/pfadfinden-theme-updater.php';
$pluginPath = ABSPATH . '/wp-content/plugins/' . $class . '/' . $class . '.php';
activate_plugin($pluginPath);
}
}
public static function recursive_copy($source, $destination) {
// Überprüfe, ob das Quellverzeichnis existiert
if (!file_exists($source)) {
return false;
}
// Erstelle das Zielpfad, wenn es nicht existiert
if (!is_dir($destination)) {
mkdir($destination, 0755, true);
}
// Durchlaufe alle Dateien und Unterverzeichnisse im Quellverzeichnis
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $item) {
if ($item->isDir()) {
// Wenn es ein Verzeichnis ist, erstelle es im Zielverzeichnis
mkdir($destination . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
} else {
// Wenn es eine Datei ist, kopiere sie in das Zielverzeichnis
copy($item, $destination . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
}
}
}
}

View File

@ -0,0 +1,75 @@
<?php
namespace Bdp\Modules\Security;
use ZipArchive;
class Security
{
public const required_security_plugins = [
'wps_hide_login' => ['downloadUrl' => 'https://downloads.wordpress.org/plugin/wps-hide-login.1.9.10.zip'],
'limit-login-attempts-reloaded' => ['downloadUrl' => 'https://downloads.wordpress.org/plugin/limit-login-attempts-reloaded.2.25.27.zip']];
public const delete_plugins = [
'akismet/akismet.php',
'hello.php'
];
public static function setup()
{
self::deletePlugins();
foreach (self::required_security_plugins as $pluginSlug => $pluginData) {
if (!is_dir(WP_PLUGIN_DIR . '/' . $pluginSlug)) {
self::installSecurityPlugin($pluginSlug, $pluginData['downloadUrl']);
}
}
$loginUrl = get_option('whl_page', 'bdp_login');
update_option('whl_page', $loginUrl);
}
public static function deletePlugins() {
deactivate_plugins(self::delete_plugins);
delete_plugins(self::delete_plugins);
}
public static function installSecurityPlugin(string $pluginSlug, string $downloadUrl) : bool
{
$ch = curl_init();
$source = $downloadUrl;
curl_setopt($ch, CURLOPT_URL, $source);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec ($ch);
curl_close ($ch);
$destination = WP_PLUGIN_DIR . '/' . $pluginSlug . '.zip';
$file = fopen($destination, "w+");
fputs($file, $data);
fclose($file);
$zip = new ZipArchive();
$zip->open($destination);
$zip->extractTo(WP_PLUGIN_DIR);
$zip->close();
unlink($destination);
$pluginInfos = get_plugins( '/'.$pluginSlug );
$installfile = $pluginSlug . '/';
if( ! empty( $pluginInfos ) ) {
foreach ($pluginInfos as $file => $info) :
$installfile .= $file;
endforeach;
}
$result = activate_plugin($installfile);
return $result === null;
}
}

View File

@ -0,0 +1,22 @@
<?php
echo '<div id="wpbody-content">';
echo '<h1>Installation erfolgreich!</h1>';
?>
<form method="post" action="admin.php?page=bdp-kompass%2Fmodules%2Findex.php&loadmodule=security">
<div class="bdp_security_outer">
<fieldset class="bdp_security_inner">
<span style="font-weight: bold;">Herzlichen Glückwunsch!</span><br /><br />
Das Plugin Kompass wurde soeben erfolgreich installiert.<br />Im Hintergrund wurden bereits erste Optimierungen an der Webseite vorgenommen, so wurde die Navcigation vereinfacht, und falls dies noch nicht der Fall war, wurde die Webseite mit einer suchmaschinenfreundlichen Struktur ausgestattet.<br />
Es wurden bereits erste sicherheitsrelevante Plugins installiert. Du findest die Übersicht, welchePlugins aktiv sind, jederzeit <a href="plugins.php">hier</a><br /><br />
Über die Kalender-Einstellungen kannst du den Kalender deines Stammes aus dem Wiki auf deiner Webseite einbinden, dieser erscheint dann automatisch unt er der Adresse <a href="<?php echo get_site_url() . '/kalender'; ?>"><?php echo get_site_url() . '/kalender'; ?></a><br /><br />
Aus Sicherheitsgründen empfiehlt es sich, die Adresse zum Dashboard deiner Webseite ztu verschleiern. Ein hierfür notwendiges Plugin wurde automatisch installiert. Um dich zukünftig auf deiner Webseite einzuloggen, nutze folgende URL:<br />
<label><?php echo get_site_url(); ?>/</label><input style="width: 250px;" class="long_text" type="text" name="login_url" id="login_url" required
value = "<?php echo get_option('whl_page', 'bdp_login'); ?>">
<br /><input class="bdp_submit" type="submit" name="submit" value="Verändere diese URL noch einmal"><br /><br />
Falls du zu diesem Plugin Anmerkungen oder Fragen hast, wende dich bitte an den LB IT.
</fieldset>
</div>
</form>

View File

@ -0,0 +1,3 @@
<?php
require_once dirname(__FILE__) . '/classes/Security.class.php';

9
modules/index.php Normal file
View File

@ -0,0 +1,9 @@
<?php
if (!isset($_REQUEST['loadmodule']) ||
!is_file(BDP_LV_PLUGIN_DIR . 'modules/' . $_REQUEST['loadmodule'] . '/internal/index.php')) {
require_once BDP_LV_PLUGIN_DIR . 'modules/about/internal/index.php';
exit;
}
require_once BDP_LV_PLUGIN_DIR . 'modules/' . $_REQUEST['loadmodule'] . '/internal/index.php';

View File

@ -0,0 +1,75 @@
<?php
namespace Bdp\Modules\Security;
use ZipArchive;
class Security
{
public const required_security_plugins = [
'wps_hide_login' => ['downloadUrl' => 'https://downloads.wordpress.org/plugin/wps-hide-login.1.9.10.zip'],
'limit-login-attempts-reloaded' => ['downloadUrl' => 'https://downloads.wordpress.org/plugin/limit-login-attempts-reloaded.2.25.27.zip']];
public const delete_plugins = [
'akismet/akismet.php',
'hello.php'
];
public static function setup()
{
self::deletePlugins();
foreach (self::required_security_plugins as $pluginSlug => $pluginData) {
if (!is_dir(WP_PLUGIN_DIR . '/' . $pluginSlug)) {
self::installSecurityPlugin($pluginSlug, $pluginData['downloadUrl']);
}
}
$loginUrl = get_option('whl_page', 'bdp_login');
update_option('whl_page', $loginUrl);
}
public static function deletePlugins() {
deactivate_plugins(self::delete_plugins);
delete_plugins(self::delete_plugins);
}
public static function installSecurityPlugin(string $pluginSlug, string $downloadUrl) : bool
{
$ch = curl_init();
$source = $downloadUrl;
curl_setopt($ch, CURLOPT_URL, $source);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec ($ch);
curl_close ($ch);
$destination = WP_PLUGIN_DIR . '/' . $pluginSlug . '.zip';
$file = fopen($destination, "w+");
fputs($file, $data);
fclose($file);
$zip = new ZipArchive();
$zip->open($destination);
$zip->extractTo(WP_PLUGIN_DIR);
$zip->close();
unlink($destination);
$pluginInfos = get_plugins( '/'.$pluginSlug );
$installfile = $pluginSlug . '/';
if( ! empty( $pluginInfos ) ) {
foreach ($pluginInfos as $file => $info) :
$installfile .= $file;
endforeach;
}
$result = activate_plugin($installfile);
return $result === null;
}
}

View File

@ -0,0 +1,32 @@
<?php
echo '<div class="health-check-body health-check-debug-tab hide-if-no-js">';
echo '<h1>Erweiterte Sicherheitseinstellungen</h1>';
if (isset($_POST['submit'])) {
echo '<div id="bdp_success">Die Einstellungen wurden gespeichert.</div>';
update_option('whl_page', $_POST['login_url']);
}
?>
<form method="post" action="admin.php?page=bdp-kompass%2Fmodules%2Findex.php&loadmodule=security">
<div class="bdp_security_outer">
<fieldset class="bdp_security_inner">
<legend>Wordpress-Login</legend>
<table>
<tr style="vertical-align: top;">
<td>Login-URL:</td>
<td> <label><?php echo get_site_url(); ?>/</label><input style="width: 100px;" class="long_text" type="text" name="login_url" id="login_url" required
value = "<?php echo get_option('whl_page', 'bdp_login'); ?>"
>/<br />
<label style="font-weight: normal; color: #a0a0a0; font-style: italic">
Du erreichst das Dashboard deiner Seite zukünftig nur noch unter dieser URL
</label>
</td>
</tr>
</table>
</fieldset>
<input class="bdp_submit" type="submit" name="submit" value="Einstellungen speichern">
</div>
</form>
</div>

View File

@ -0,0 +1,25 @@
<?php
function wp_example_site_health_navigation_tabs( $tabs ) {
// translators: Tab heading for Site Health navigation.
$tabs['loginurl'] = esc_html_x( 'Login-URL', 'Site Health', 'text-domain' );
return $tabs;
}
add_filter( 'site_health_navigation_tabs', 'wp_example_site_health_navigation_tabs' );
function wp_example_site_health_tab_content($tab)
{
// Do nothing if this is not our tab.
if ('loginurl' === $tab) {
require_once dirname(__FILE__) . '/internal/index.php';
return;
}
}
add_action('site_health_tab_content', 'wp_example_site_health_tab_content');
require_once dirname(__FILE__) . '/classes/Security.class.php';

View File

@ -0,0 +1,13 @@
<?php
namespace Bdp\Modules\Seo;
class Seo
{
public static function setup()
{
if (get_option('permalink_structure') === '') {
update_option('permalink_structure', '/%postname%/');
flush_rewrite_rules();
}
}
}

2
modules/seo/seo.php Normal file
View File

@ -0,0 +1,2 @@
<?php
require_once dirname(__FILE__) . '/classes/Seo.class.php';

View File

@ -0,0 +1,97 @@
msgid ""
msgstr ""
"Project-Id-Version: pfadfinden-theme-updater\n"
"POT-Creation-Date: 2015-08-26 01:49+0100\n"
"PO-Revision-Date: 2015-08-26 02:02+0100\n"
"Last-Translator: Philipp Cordes <philipp.cordes@pfadfinden.de>\n"
"Language-Team: \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.10\n"
"X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;_x;esc_html_e;esc_html__;esc_attr_e;esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2;_n_noop:1,2;__ngettext_noop:1,2;_c,_nc:4c,1,2;\n"
"X-Poedit-SearchPath-0: .\n"
#: pfadfinden-theme-updater.php:70
msgid ""
"Couldnt load required library “shy-wordpress”. Reinstalling the plugin may "
"solve this problem."
msgstr ""
"Konnte die erforderliche Bibliothek „shy-wordpress“ nicht laden. "
"Neuinstallation des Plugins sollte das Problem beheben."
#: pfadfinden-theme-updater.php:81
msgid "The plugin is incomplete. Reinstalling it may solve this problem."
msgstr ""
"Das Plugin ist unvollständig. Neuinstallation sollte das Problem beheben."
#: pfadfinden-theme-updater.php:96
#, php-format
msgid ""
"You need at least PHP 5.4 to use Pfadfinden Theme Updater. Your are using %s."
msgstr ""
"Du brauchst mindestens PHP 5.4, um den Pfadfinden-Theme-Updater zu benutzen. "
"Aktuell benutzt du PHP %s."
#: pfadfinden-theme-updater.php:104
msgid "Pfadfinden Theme Updater"
msgstr "Pfadfinden-Theme-Updater"
#: pfadfinden-theme-updater.php:105
msgid ""
"Adds the Pfadfinden theme repository to your choice of themes. Requires an "
"API key."
msgstr ""
"Fügt den Pfadfinden-Theme-Katalog zu Deiner Auswahl an Themes hinzu. "
"Benötigt einen API-Schlüssel."
#: src/Pfadfinden/WordPress/ThemeRepository.php:81
msgid "Your theme repository query is too long."
msgstr "Deine Anfrage an den Theme-Katalog ist zu lang."
#: src/Pfadfinden/WordPress/ThemeRepository.php:114
msgid "Unknown theme repository server error, no message attached."
msgstr ""
"Unbekannter Theme-Katalog-Serverfehler, keine Fehlerbeschreibung "
"mitgeschickt."
#: src/Pfadfinden/WordPress/ThemeRepository.php:186
msgid "Ambiguous result for single theme information call."
msgstr "Mehrere Ergebnisse für Abfrage nach Informationen zu einem Theme."
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:69
msgid "Pfadfinden Theme Updater Settings"
msgstr "Pfadfinden-Theme-Updater-Einstellungen"
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:74
msgid "Pfadfinden Updater"
msgstr "Pfadfinden-Updater"
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:84
msgid "API Key"
msgstr "API-Schlüssel"
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:89
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:116
msgid "An API key consists of 10 alphanumeric characters."
msgstr "Ein API-Schlüssel besteht aus zehn alphanumerischen Zeichen."
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:96
msgid "Keep Settings"
msgstr "Einstellungen merken"
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:97
msgid "Dont delete settings when uninstalling the plugin."
msgstr "Einstellungen nicht löschen, wenn das Plugin deinstalliert wird."
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:107
msgid "Just testing? Try APITESTKEY."
msgstr ""
"Nur Ausprobieren? Nimm APITESTKEY. Aber BdP-Themes gibt es damit nicht…"
#~ msgid "Activated Features"
#~ msgstr "Aktivierte Funktionen"

View File

@ -0,0 +1,84 @@
msgid ""
msgstr ""
"Project-Id-Version: pfadfinden-theme-updater\n"
"POT-Creation-Date: 2015-08-26 01:49+0100\n"
"PO-Revision-Date: 2015-08-26 01:50+0100\n"
"Last-Translator: Philipp Cordes <philipp.cordes@pfadfinden.de>\n"
"Language-Team: \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.10\n"
"X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;_x;esc_html_e;esc_html__;esc_attr_e;esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2;_n_noop:1,2;__ngettext_noop:1,2;_c,_nc:4c,1,2;\n"
"X-Poedit-SearchPath-0: .\n"
#: pfadfinden-theme-updater.php:70
msgid ""
"Couldnt load required library “shy-wordpress”. Reinstalling the plugin may "
"solve this problem."
msgstr ""
#: pfadfinden-theme-updater.php:81
msgid "The plugin is incomplete. Reinstalling it may solve this problem."
msgstr ""
#: pfadfinden-theme-updater.php:96
#, php-format
msgid ""
"You need at least PHP 5.4 to use Pfadfinden Theme Updater. Your are using %s."
msgstr ""
#: pfadfinden-theme-updater.php:104
msgid "Pfadfinden Theme Updater"
msgstr ""
#: pfadfinden-theme-updater.php:105
msgid ""
"Adds the Pfadfinden theme repository to your choice of themes. Requires an "
"API key."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeRepository.php:81
msgid "Your theme repository query is too long."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeRepository.php:114
msgid "Unknown theme repository server error, no message attached."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeRepository.php:186
msgid "Ambiguous result for single theme information call."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:69
msgid "Pfadfinden Theme Updater Settings"
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:74
msgid "Pfadfinden Updater"
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:84
msgid "API Key"
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:89
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:116
msgid "An API key consists of 10 alphanumeric characters."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:96
msgid "Keep Settings"
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:97
msgid "Dont delete settings when uninstalling the plugin."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:107
msgid "Just testing? Try APITESTKEY."
msgstr ""

View File

@ -0,0 +1,149 @@
<?php
/*
Plugin Name: Pfadfinden Theme Updater
Plugin URI: http://lab.hanseaten-bremen.de/themes/
Description: Adds the Pfadfinden theme repository to your choice of themes. Requires an API key.
Version: 0.2
Author: Philipp Cordes
Text Domain: pfadfinden-theme-updater
Domain Path: /languages/
License: GPLv2 or later
*/
if ( ! defined( 'ABSPATH' ) ) {
die( 'Im a plugin.' );
}
/**
* Load localized strings for the plugin.
*
* @see http://geertdedeckere.be/article/loading-wordpress-language-files-the-right-way
*/
function pfadfinden_theme_updater_load_textdomain()
{
remove_action( 'init', __FUNCTION__ );
$domain = 'pfadfinden-theme-updater';
// Filter known from load_plugin_textdomain().
$locale = apply_filters( 'plugin_locale', get_locale(), $domain );
load_textdomain( $domain, WP_LANG_DIR . "/pfadfinden-theme-updater/$domain-$locale.mo" );
load_plugin_textdomain( $domain, false, basename( __DIR__ ) . '/languages/' );
}
add_action( 'init', 'pfadfinden_theme_updater_load_textdomain' );
if ( ! function_exists( 'trigger_pfadfinden_plugin_error' ) ) {
/**
* Show an error message.
*
* @see http://www.squarepenguin.com/wordpress/?p=6 Inspiration
*
* @param string $message
* @param int $type optional
* @return bool
*/
function trigger_pfadfinden_plugin_error( $message, $type = 0 )
{
if ( isset( $_GET['action'] ) && 'error_scrape' === $_GET['action'] ) {
echo $message;
return true;
}
if ( ! $type ) {
$type = E_USER_WARNING;
}
return trigger_error( $message, $type );
}
}
// Check for suitable environment
if ( defined( 'PHP_VERSION_ID' ) && PHP_VERSION_ID >= 50400 ) {
// If were the first user of the library, use the bundled one
if ( ! class_exists( 'Shy\WordPress\Plugin' ) ) {
pfadfinden_theme_updater_load_textdomain();
if ( ! include_once __DIR__ . '/use/shy-wordpress/src/autoloader.php' ) {
trigger_pfadfinden_plugin_error(
__( 'Couldnt load required library “shy-wordpress”. Reinstalling the plugin may solve this problem.', 'pfadfinden-theme-updater' ),
E_USER_ERROR
);
return;
}
}
// Register our autoloader
if ( ! include_once __DIR__ . '/src/autoloader.php' ) {
pfadfinden_theme_updater_load_textdomain();
trigger_pfadfinden_plugin_error(
__( 'The plugin is incomplete. Reinstalling it may solve this problem.', 'pfadfinden-theme-updater' ),
E_USER_ERROR
);
return;
}
// PHP < 5.3 issues a parse error if we instance the class here
return require_once __DIR__ . '/startup.php';
}
// Display error message
pfadfinden_theme_updater_load_textdomain();
trigger_pfadfinden_plugin_error(
sprintf(
__( 'You need at least PHP 5.4 to use Pfadfinden Theme Updater. Your are using %s.', 'pfadfinden-theme-updater' ),
PHP_VERSION
),
E_USER_ERROR
);
if ( false ) {
// Dummy calls for translation to include metadata in translation files
__( 'Pfadfinden Theme Updater', 'pfadfinden-theme-updater' );
__( 'Adds the Pfadfinden theme repository to your choice of themes. Requires an API key.', 'pfadfinden-theme-updater' );
}
class Nginx {
private $plugin = 'nginx-helper/nginx-helper.php';
private $pluginPath = ABSPATH . 'wp-content/plugins/nginx-helper/nginx-helper.php';
public function __construct() {
if(is_readable($this->pluginPath)) {
require_once(ABSPATH .'/wp-admin/includes/plugin.php');
$this->activatePlugin();
$this->loadCss();
}
}
private function activatePlugin() {
if( is_plugin_active( $this->plugin ) && get_option('cloudpit_nginx_activated_once') == 1 ) {
//if the plugin is active already and our option is set, do nothing
return;
}
if( !is_plugin_active( $this->plugin ) && get_option('cloudpit_nginx_activated_once') == 1 ) {
//if the plugin is deactivated on purpuse after installation, do nothing
return;
}
activate_plugin($this->pluginPath);
$options = 'a:23:{s:12:"enable_purge";s:1:"1";s:12:"cache_method";s:14:"enable_fastcgi";s:12:"purge_method";s:11:"get_request";s:10:"enable_map";N;s:10:"enable_log";N;s:9:"log_level";s:4:"INFO";s:12:"log_filesize";s:1:"5";s:12:"enable_stamp";N;s:22:"purge_homepage_on_edit";s:1:"1";s:21:"purge_homepage_on_del";s:1:"1";s:21:"purge_archive_on_edit";s:1:"1";s:20:"purge_archive_on_del";s:1:"1";s:28:"purge_archive_on_new_comment";N;s:32:"purge_archive_on_deleted_comment";N;s:17:"purge_page_on_mod";s:1:"1";s:25:"purge_page_on_new_comment";s:1:"1";s:29:"purge_page_on_deleted_comment";s:1:"1";s:14:"redis_hostname";s:9:"127.0.0.1";s:10:"redis_port";s:4:"6379";s:12:"redis_prefix";s:12:"nginx-cache:";s:9:"purge_url";s:0:"";s:25:"redis_enabled_by_constant";i:0;s:28:"smart_http_expire_form_nonce";s:10:"87a3b2c240";}';
add_option('rt_wp_nginx_helper_options', unserialize($options));
if(!get_option('cloudpit_nginx_activated_once')) {
add_option('cloudpit_nginx_activated_once', 1);
}
}
private function loadCss() {
if( !is_plugin_active( $this->plugin ) ) {
return;
}
wp_enqueue_style('cloudpit-css', plugin_dir_url( __FILE__ ) . 'assets/style.css',array(), filemtime(plugin_dir_path( __FILE__ ) . 'assets/style.css'));
}
}

View File

@ -0,0 +1,7 @@
<phpunit bootstrap="tests/bootstrap.php">
<testsuites>
<testsuite>
<directory suffix="Test.php" phpVersion="5.4.0">tests</directory>
</testsuite>
</testsuites>
</phpunit>

Some files were not shown because too many files have changed in this diff Show More