|
- <?php
- /**
- * Plugin name: sandbox adaptions
- * Plugin URI: https://www.netzgestaltung.at
- * Author: Thomas Fellinger
- * Author URI: https://www.netzgestaltung.at
- * Version: 0.1
- * Description: Custom website functions
- * License: GPL v2
- * Copyright 2020 Thomas Fellinger (email : office@netzgestaltung.at)
-
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
- define('SANDBOX_ADAPTIONS_PATH', plugin_dir_path(__FILE__));
- define('SANDBOX_ADAPTIONS_URL', plugin_dir_url(__FILE__));
-
- /**
- * Ajax hooks
- * ==========
- */
- // user edit ajax
- add_action('wp_ajax_user_edit', 'sandbox_ajax_user_edit');
-
- /**
- * Plugin setup hook
- * ================
- */
- add_action('plugins_loaded', 'sandbox_setup_site');
-
-
- function sandbox_setup_site() {
- add_post_type_support('page', 'excerpt');
-
- // init image sizes
- sandbox_image_sizes();
-
- // init custom widgets
- add_action('widgets_init', 'sandbox_widgets_init');
- // disable emoji support for more pagespeed
- add_action('init', 'sandbox_disable_emojis');
- // remove unused default taxonomies
- add_action('init', 'sandbox_unregister_taxonomies');
-
- // load admin styles
- add_action('admin_head', 'sandbox_admin_styles_load');
-
- // remove WLW
- // https://wphacks.wordpress.com/2008/08/27/wordpress-tip-remove-wlw-rsd-link/
- remove_action('wp_head', 'wlwmanifest_link');
-
- // remove xml-rpc edit link
- remove_action('wp_head', 'rsd_link');
-
- // Remove generator info
- // https://bhoover.com/remove-unnecessary-code-from-your-wordpress-blog-header/
- remove_action('wp_head', 'wp_generator');
-
- // remove wp-sitemap.xml when using a xml sitemap plugin
- add_filter('wp_sitemaps_enabled', '__return_false');
-
- // quick fix for https://wordpress.org/support/topic/jqeuery-error-live-is-not-a-function/
- add_action('admin_enqueue_scripts', 'sandbox_jcf_admin_fix');
-
- // add a position field to user profile
- // add_action( 'show_user_profile', 'sandbox_user_profile' );
- // add_action( 'edit_user_profile', 'sandbox_user_profile' );
-
- // save/update position user profile field
- // add_action( 'personal_options_update', 'sandbox_save_user_profile' );
- // add_action( 'edit_user_profile_update', 'sandbox_save_user_profile' );
-
- if ( !is_admin() ) {
- // add usefull classNames
- add_filter('body_class', 'sandbox_body_class');
- add_filter('post_class', 'sandbox_post_class');
- add_filter('nav_menu_css_class', 'sandbox_menu_item_class', 10, 2);
- add_filter('the_category', 'sandbox_category_class');
-
- // adds login and out links to menus "site-loggedin" and "site-loggedout"
- add_filter('wp_nav_menu_items', 'sandbox_nav_menu_items', 10, 2);
-
- // Custom login screen
- add_filter('login_headerurl', 'sandbox_login_headerurl');
- add_filter('login_headertext', 'sandbox_login_headertext');
- add_filter('login_enqueue_scripts', 'sandbox_login_enqueue_scripts');
-
- // Change Wordpress email subject
- add_filter('wp_mail_from_name', 'sandbox_mail_from_name');
-
- // remove lazy block wrapper container markup in frontend
- add_filter( 'lzb/block_render/allow_wrapper', '__return_false' );
-
- // custom archive query settings
- add_action( 'pre_get_posts', 'sandbox_archive_query');
-
- // Admin pages related stuff
- } else {
- // add usefull classNames
- add_filter('admin_body_class', 'sandbox_admin_body_class');
- }
-
- // plugin integrations
-
- // lazy block Handlebars helper
- add_action('lzb_handlebars_object', 'sandbox_lazyblock_handlebars_helper');
-
- // listo order for cf7 select input
- add_filter('wpcf7_form_tag_data_option', 'sandbox_listo_ordered', 11, 1);
- // listo uses an iso3 country list
- // country iso2 to iso3:
- // https://github.com/i-rocky/country-list-js/blob/master/data/iso_alpha_3.json
- // all countries and phone-codes (iso2):
- // https://github.com/ChromaticHQ/intl-tel-input/blob/master/src/js/data.js
-
- // handle required attribute
- add_filter('wpcf7_form_elements', 'sandbox_wpcf7_form_elements');
-
- // filter values of form tags to email
- add_filter( 'cf7sg_mailtag_email-updates', 'sandbox_cf7_mailtag_email_updates', 10, 3);
-
- // remove layout from "cf7 smart grid plugin"
- // add_action('smart_grid_register_styles', 'sandbox_smart_grid_register_styles');
-
- // use really simple captcha in contact form 7
- // add_filter('wpcf7_use_really_simple_captcha', '__return_true');
-
- // CF7 gated content with custom field
- add_filter('do_shortcode_tag', 'sandbox_cf7_gated_content', 10, 3);
-
- }
-
- // Check if function "wp_body_open" exits, if not create it
- if ( !function_exists('wp_body_open') ) {
- function wp_body_open() {
- do_action('wp_body_open');
- }
- }
-
- // add custom image sizes
- function sandbox_image_sizes() {
- $image_sizes = sandbox_get_image_sizes();
-
- if ( !empty( $image_sizes ) ) {
- foreach ( $image_sizes as $id => $size ) {
- add_image_size( $id, $size['args']['w'], $size['args']['h'], $size['args']['crop'] );
- }
- }
- }
-
- /**
- * custom image sizes settings
- *
- * @see https://en.wikipedia.org/wiki/16:9_aspect_ratio
- */
- function sandbox_get_image_sizes() {
-
- $sizes = array();
-
-
- // larger thumbnail
- $sizes['thumbnail-semi-large'] = array(
- 'title' => __('Thumbnail-Semi-Large', 'sandbox'),
- 'args' => array(
- 'w' => 640,
- 'h' => 640,
- 'crop' => true,
- ),
- );
-
- // Standard (with sidebar) 16:9
- $sizes['sandbox-default'] = array(
- 'title' => __('Standard (with sidebar)', 'sandbox'),
- 'args' => array(
- 'w' => 800,
- 'h' => 450,
- 'crop' => true,
- ),
- );
-
- //Full width (no sidebar) 16:9
- $sizes['sandbox-wide'] = array(
- 'title' => __('Full Width (no sidebar)', 'sandbox'),
- 'args' => array(
- 'w' => 1280,
- 'h' => 720,
- 'crop' => true,
- ),
- );
-
- // Hero image 16:9
- $sizes['sandbox-hero'] = array(
- 'title' => __('Hero image', 'sandbox'),
- 'args' => array(
- 'w' => 1920,
- 'h' => 1080,
- 'crop' => true,
- ),
- );
-
- // Hero image 16:9
- $sizes['blog-hero'] = array(
- 'title' => __('Hero image', 'sandbox'),
- 'args' => array(
- 'w' => 1500,
- 'h' => 476,
- 'crop' => true,
- ),
- );
-
- // keep aspect ratio
- $sizes['semi-large'] = array(
- 'title' => __('Semi-Large', 'sandbox'),
- 'args' => array(
- 'w' => 640,
- 'h' => 640,
- 'crop' => false,
- ),
- );
-
- return $sizes;
- }
-
- // Custom login screen - home url
- function sandbox_login_headerurl(){
- return home_url();
- }
-
- // Custom login screen - header text
- function sandbox_login_headertext(){
- return wp_get_document_title();
- }
-
- // Custom login screen - login style
- function sandbox_login_enqueue_scripts(){
- // loads style/images from template folder
- wp_register_style('sandbox_login', get_template_directory_uri() . '/css/login.css');
- wp_enqueue_style('sandbox_login');
- }
-
- // init custom widgets
- function sandbox_widgets_init(){
- register_widget('sandbox_faq_nav_widget');
- // register_widget('sandbox_events_widget');
- // register_widget('sandbox_social_widget');
- // register_widget('sandbox_slider_widget');
- }
-
- /**
- * Disable the emoji's
- * https://kinsta.com/knowledgebase/disable-emojis-wordpress/
- */
- function sandbox_disable_emojis(){
- remove_action('wp_head', 'print_emoji_detection_script', 7 );
- remove_action('admin_print_scripts', 'print_emoji_detection_script');
- remove_action('wp_print_styles', 'print_emoji_styles');
- remove_action('admin_print_styles', 'print_emoji_styles');
- remove_filter('the_content_feed', 'wp_staticize_emoji');
- remove_filter('comment_text_rss', 'wp_staticize_emoji');
- remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
- add_filter('tiny_mce_plugins', 'disable_emojis_tinymce');
- add_filter('wp_resource_hints', 'disable_emojis_remove_dns_prefetch', 10, 2 );
- }
-
- /**
- * Filter function used to remove the tinymce emoji plugin.
- *
- * @param array $plugins
- * @return array Difference betwen the two arrays
- */
- function disable_emojis_tinymce($plugins) {
- if ( is_array($plugins) ) {
- return array_diff($plugins, array('wpemoji'));
- } else {
- return array();
- }
- }
-
- /**
- * Remove emoji CDN hostname from DNS prefetching hints.
- *
- * @param array $urls URLs to print for resource hints.
- * @param string $relation_type The relation type the URLs are printed for.
- * @return array Difference betwen the two arrays.
- */
- function disable_emojis_remove_dns_prefetch( $urls, $relation_type ) {
- if ( 'dns-prefetch' == $relation_type ) {
- /** This filter is documented in wp-includes/formatting.php */
- $emoji_svg_url = apply_filters('emoji_svg_url', 'https://s.w.org/images/core/emoji/2/svg/');
- $urls = array_diff( $urls, array( $emoji_svg_url ) );
- }
- return $urls;
- }
-
- // remove unused default taxonomies
- function sandbox_unregister_taxonomies(){
- register_taxonomy('category', array(), array('show_in_nav_menus' => false));
- }
-
- // adds usefull body classNames
- // @param $classes array
- function sandbox_body_class($classes){
- $classNames = array();
- $post = get_post();
- $parents = get_post_ancestors($post);
- $slug = sandbox_get_the_slug();
- $post_type = get_post_type();
-
- $classNames[] = $post_type . '-' . $slug;
-
- if ( is_home() ) {
- $classNames[] = 'archive';
- }
- if ( is_active_sidebar('content-before') && is_active_sidebar('content-after') ) {
- $classNames[] = 'has-content-sidebars';
- } else if ( is_active_sidebar('content-before') || is_active_sidebar('content-after') ) {
- $classNames[] = 'has-content-sidebar';
- if ( is_active_sidebar('content-before') ) {
- $classNames[] = 'has-sidebar-content-before';
- } else if ( is_active_sidebar('content-after') ) {
- $classNames[] = 'has-sidebar-content-after';
- }
- }
- /* use for parent pages as sections
- if ( !empty($parents) ) {
- $parents[] = $post->ID;
- foreach ( $parents as $parentID ) {
- if ( $parentID === 8 ) {
- $classNames[] = 'section-you-name-it';
- }
- }
- }
- */
- // echo var_dump($classes);
- return array_merge( $classes, $classNames );
- }
-
- // add usefull classNames
- // @param $classes string
- function sandbox_admin_body_class($classes){
- $classNames = '';
- $screen = get_current_screen();
-
- if ( $screen->base === 'post' && $screen->post_type === 'page' ) {
- $page_template = get_post_meta(get_the_ID(), '_wp_page_template', true);
- $classNames .= ' used-template-' . esc_attr(str_replace('.php', '', $page_template));
- }
- return $classes . ' ' . $classNames;
- }
-
- // add custom styles for admin section
- function sandbox_admin_styles_load(){
- wp_register_style('sandbox_admin', SANDBOX_ADAPTIONS_URL . '/admin/style.css');
- wp_enqueue_style('sandbox_admin');
- }
-
- function sandbox_jcf_admin_fix(){
- $screen = get_current_screen();
- if ( in_array($screen->id, array('settings_page_jcf_admin', 'settings_page_jcf_fieldset_index')) ) {
- wp_enqueue_script('jquery-migrate');
- }
- }
-
- // add a position field to user profile
- function sandbox_user_profile($user) { ?>
- <h3>Extra profile information</h3>
- <table class="form-table">
- <tr>
- <th><label for="twitter">Position</label></th>
- <td>
- <input type="text" name="_position" id="position" value="<?php echo esc_attr(get_the_author_meta( '_position', $user->ID)); ?>" class="regular-text" /><br />
- <span class="description">Please enter position at your organisation.</span>
- </td>
- </tr>
- <tr>
- <th><label for="linkedin">LinkedIn</label></th>
- <td>
- <input type="text" name="_linkedin" id="linkedin" value="<?php echo esc_attr(get_the_author_meta( '_linkedin', $user->ID)); ?>" class="regular-text" /><br />
- <span class="description">Please enter your LinkedIn username.</span>
- </td>
- </tr>
- </table>
- <?php }
-
- // save/update position user profile field
- function sandbox_save_user_profile($user_id){
- if ( !current_user_can('edit_user', $user_id) )
- return false;
-
- // Copy and paste this line for additional fields. Make sure to change '_position' to the field ID.
- update_usermeta($user_id, '_position', $_POST['_position']);
-
- /* Copy and paste this line for additional fields. Make sure to change 'twitter' to the field ID. */
- update_usermeta($user_id, '_linkedin', $_POST['_linkedin']);
- }
-
- // adds usefull post classNames
- function sandbox_post_class($classes){
- $classNames = array();
- if ( !has_post_thumbnail() ) {
- $classNames[] = 'no-post-thumbnail';
- }
- return array_merge($classes, $classNames);
- }
-
- // adds usefull menu-item classNames
- function sandbox_menu_item_class($classes, $item){
-
- // Add slugs to menu-items
- if ('category' == $item->object ) {
- $category = get_category( $item->object_id );
- $classes[] = 'category-' . $category->slug;
- } else if ('format' == $item->object ){
- $format = get_term($item->object_id);
- $classes[] = 'format-' . $format->slug;
- }
- return $classes;
- }
-
- // adds usefull category classNames
- function sandbox_category_class($thelist){
- $categories = get_the_category();
-
- if ( !$categories || is_wp_error($categories) ) {
- return $thelist;
- }
- $output = '<ul class="post-categories">';
- foreach ( $categories as $category ) {
- $output .= '<li class="category-' . $category->slug . '"><a href="' . esc_url(get_category_link($category->term_id)) . '">' . $category->name . '</a></li>';
- }
- $output .= '</ul>';
- return $output;
- }
-
- // adds login and out links to menus "site-loggedin" and "site-loggedout"
- function sandbox_nav_menu_items($items, $args){
- if ( is_user_logged_in() ) {
- if ( $args->menu->slug === 'site-loggedin' ) {
- // add logout link to the end of the menu
- $logout_class = 'menu-item-logout menu-item menu-item-type-custom menu-item-object-custom';
- $items .= '<li class="' . $logout_class . '">' . wp_loginout(get_permalink(), false) . '</li>';
- }
- } elseif ( $args->menu->slug === 'site-loggedout' ) {
- // add login link to the begin of the menu
- $login_class = 'menu-item-login menu-item menu-item-type-custom menu-item-object-custom';
- $items = '<li class="' . $login_class . '">' . wp_loginout(get_permalink(), false) . '</li>' . $items;
- }
- return $items;
- }
-
- /**
- * user edit ajax system
- * =====================
- * passwords strenght meter taken from:
- * https://code.tutsplus.com/articles/using-the-included-password-strength-meter-script-in-wordpress--wp-34736
- * https://github.com/WordPress/WordPress/blob/master/wp-admin/js/user-profile.js#L223
- * ajax idea:
- * https://wordpress.stackexchange.com/questions/274778/updating-user-profile-with-ajax-not-working
- * form field validation:
- * https://itnext.io/https-medium-com-joshstudley-form-field-validation-with-html-and-a-little-javascript-1bda6a4a4c8c
- * page template idea:
- * https://wordpress.stackexchange.com/questions/9775/how-to-edit-a-user-profile-on-the-front-end
- */
- function sandbox_ajax_user_edit(){
- check_ajax_referer('sandbox_ajax_call', 'verify');
-
- // list of valid field names
- $fields = array('user_login', 'first_name', 'last_name', 'nickname', 'display_name', 'pass1');
-
- if ( isset($_POST['field_name']) ) {
- $field_name = $_POST['field_name'];
-
- if ( in_array($field_name, $fields) ) { // valid field
- if ( isset($_POST[$field_name]) ) { // field value is set
- $value = filter_var(trim($_POST[$_POST['field_name']]), FILTER_SANITIZE_STRING);
- $pattern = '/[A-Za-z0-9 ]{3,32}/';
- if ( $_POST['field_name'] === 'nickname' ) {
- $pattern = '/[a-zA-Z0-9-_ ]{3,32}/';
- }
- if ( $_POST['field_name'] === 'pass1' ) {
- $pattern = '/^[^\\\\]*$/';
- }
- if ( preg_match($pattern, $value) ) { // check valid pattern
- $current_user = wp_get_current_user();
- // reset $_POST
- $_POST = array(
- 'email' => $current_user->user_email,
- );
- if ( $field_name !== 'nickname' ) {
- $_POST['nickname'] = $current_user->nickname;
- }
- // readd value
- $_POST[$field_name] = $value;
- if ( $field_name === 'pass1' ) {
- $_POST['pass2'] = $value;
- }
- $edited_user = edit_user($current_user->ID);
- if ( gettype($edited_user) === "integer" ) {
- $json = array('error' => false, 'message' => 'Value "' . $value . '" for field "' . $field_name . '" was saved');
- } else {
- $json = array('error' => true, 'debug' => array('user_edit' => $edited_user), 'message' => 'User was not saved, look at "debug" array');
- }
- } else {
- $json = array('error' => true, 'message' => 'Value for field "' . $_POST['field_name'] . '" is not valid');
- }
- } else {
- $json = array('error' => true, 'message' => 'No value for field "' . $_POST['field_name'] . '" sent');
- }
- } else {
- $json = array('error' => true, 'message' => 'Given fieldname "' . $_POST['field_name'] . '" is not valid');
- }
- } else {
- $json = array('error' => true, 'message' => 'No "field" Param fieldname sent');
- }
- wp_send_json($json);
- }
-
- // Change Wordpress email subject
- function sandbox_mail_from_name($name){
- return get_bloginfo('name', 'display');
- }
-
- // custom archive query settings
- function sandbox_archive_query($query){
- if ( $query->is_main_query() && !is_admin() ) {
- if ( is_post_type_archive('aktivitaet') ) {
- //If you wanted it for the archive of a custom post type use: is_post_type_archive( $post_type )
- $query->set('meta_key', '_date-begin');
- //Set the orderby
- $query->set('orderby', 'meta_value');
- //Set the order ASC or DESC
- $query->set('order', 'ASC');
- }
- }
- }
-
- /**
- * lazy block Handlebars helper
- *
- * image sizes helper
- * https://github.com/nk-o/lazy-blocks/issues/68
- */
- function sandbox_lazyblock_handlebars_helper($handlebars){
- $handlebars->registerHelper('wp_get_attachment_image', function($image, $size=null){
- if ( isset($image['id']) ) {
- return wp_get_attachment_image($image['id'], $size);
- }
- });
- }
-
- /**
- * Sort countries list by name instead country-iso-code
- * https://wordpress.org/support/topic/excellent-9087/
- */
- function sandbox_listo_ordered($data){
- if ( is_array($data) ) {
- sort($data);
- }
- return $data;
- }
- /**
- * Return all visible form elements
- *
- * Handle required input attribute
- * https://github.com/netzgestaltung/contact-form-7-hooks#filters-in-contact-form-7includescontact-formphp
- *
- * @return $form_elements
- */
- function sandbox_wpcf7_form_elements($elements){
- return str_replace(' aria-required', ' required aria-required', $elements);
- }
-
- /**
- * filter values of form tags to email
- *
- * @param $tag_replace string to change
- * @param $submitted an array containing all submitted fields
- * @param $cf7_key is a unique string key to identify your form, which you can find in your form table in the dashboard.
- */
- function sandbox_cf7_mailtag_email_updates($tag_replace, $submitted, $cf7_key){
- if ( $cf7_key == 'free-trial' ) {
- if ( $tag_replace === '' ) { // empty means no
- $tag_replace = 'no'; //change the email-updates.
- }
- }
- return $tag_replace;
- }
-
- function sandbox_smart_grid_register_styles(){
- // wp_deregister_style('cf7-grid-layout');
- }
-
- /**
- * filter output of forms to add gated content if custom field is used
- */
- function sandbox_cf7_gated_content($output, $tag, $attr){
- // only for cf7 shortcodes
- if( 'contact-form-7' === $tag ){
- $form_id = isset($attr['id']) ? $attr['id'] : false;
-
- if ( $form_id ) {
- $form_file_download_id = get_post_meta($form_id, '_form-file-download', true);
-
- if ( !empty($form_file_download_id) ) {
- $form_file_download_url = wp_get_attachment_url($form_file_download_id);
- $form_file_download = get_attached_file($form_file_download_id);
- $form_file_path = pathinfo($form_file_download);
- $form_file_name = $form_file_path['filename'] . '.' . $form_file_path['extension'];
- ob_start();
- ?>
- <script type="text/javascript">
- ;(function(){
- document.addEventListener('wpcf7mailsent', function(event){
- var download;
-
- if ( event.detail.hasOwnProperty('contactFormId') && parseInt(event.detail.contactFormId) === <?php echo $form_id; ?> ) {
- download = document.createElement('a');
- download.href = '<?php echo $form_file_download_url; ?>';
- download.download = '<?php echo $form_file_name; ?>';
- download.click();
- }
- }, false);
- })();
- </script>
- <?php
- $gated_content = ob_get_contents();
- ob_end_clean();
- $output = $output . $gated_content;
- }
- }
- }
- return $output;
- }
-
- /**
- * Site Widgets
- * =============
- */
-
- /**
- * custom faq navigation widget
- * ============================
- * requires the post-type "faq"
- * requires the taxonomy "topic"
- */
- class sandbox_faq_nav_widget extends WP_Widget {
-
- public function __construct() {
- /* Widget settings. */
- $widget_ops = array('classname' => 'faq-navigation', 'description' => 'Displays the FAQ navigation.');
-
- /* Widget control settings. */
- $control_ops = array('width' => 300, 'height' => 350, 'id_base' => 'faq-navigation');
-
- /* Create the widget. */
- parent::__construct('faq-navigation', 'FAQ Navigation', $widget_ops, $control_ops);
- }
-
- // processes widget options to be saved
- public function update($new_instance, $old_instance) {
- $instance = $old_instance;
- $instance['title'] = strip_tags($new_instance['title']);
- return $instance;
- }
-
- // outputs the content of the widget
- public function widget($args, $instance) {
- sandbox_faq_nav($args, $instance);
- }
-
- // outputs the options form on admin
- public function form($instance) {
- $title = esc_attr($instance['title']);
-
- ?><p>
- <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', 'sandbox'); ?></label>
- <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
- </p><?php
- }
-
- }
- function sandbox_faq_nav($args, $instance){
- extract($args);
-
- $widget_title = apply_filters('widget_title', $instance['title']);
-
- /**
- * FAQ entries
- * grouped by topic
- * ordered by menu_order *
- */
- $faq_ids = get_posts(array(
- 'post_type' => 'faq',
- 'posts_per_page' => -1,
- 'fields' => 'ids',
- 'meta_query' => array(
- 'relation' => 'OR',
- array(
- 'key' => '_hide',
- 'value' => 1,
- 'compare' => 'NOT LIKE',
- ),
- array(
- 'key' => '_hide',
- 'value' => 'bug #23268',
- 'compare' => 'NOT EXISTS',
- )
- ),
- ));
- $topic_term_objects = get_terms(array(
- 'taxonomy' => 'topic',
- 'object_ids' => $faq_ids,
- 'orderby' => 'order', // needs plugin https://github.com/stuttter/wp-term-order/
- 'order' => 'ASC',
- ));
-
- if ( !empty($topic_term_objects) && !is_wp_error($topic_term_objects) ) {
- echo $before_widget;
-
- if ( $widget_title ) {
- echo $before_title . $widget_title . $after_title;
- }
- echo '<ul class="menu menu-faq">';
-
- foreach ( $topic_term_objects as $topic_term_object ) {
- $faq_options = array(
- 'post_type' => 'faq',
- 'tax_query' => array(
- array(
- 'field' => 'slug',
- 'taxonomy' => 'topic',
- 'terms' => $topic_term_object->slug,
- )
- ),
- 'meta_query' => array(
- 'relation' => 'OR',
- array(
- 'key' => '_hide',
- 'value' => 1,
- 'compare' => 'NOT LIKE',
- ),
- array(
- 'key' => '_hide',
- 'value' => 'bug #23268',
- 'compare' => 'NOT EXISTS',
- )
- ),
- 'posts_per_page' => -1,
- 'orderby' => 'menu_order',
- 'order' => 'ASC',
- );
- $faq_query = new WP_Query($faq_options);
-
- if ( $faq_query->have_posts() ) {
- echo '<li class="menu-item menu-item-' . esc_attr($topic_term_object->slug) . '">';
- echo '<a href="#submenu-' . esc_attr($topic_term_object->slug) . '">' . $topic_term_object->name . '</a>';
- echo '<ul id="submenu-' . esc_attr($topic_term_object->slug) . '" class="sub-menu">';
-
- while ( $faq_query->have_posts() ) {
- $faq_query->the_post();
-
- $post_id = get_the_ID();
- $post_slug = sandbox_get_the_slug();
- $post_class = get_post_class();
-
- echo '<li id="menu-item-' . $post_slug . '" class="' . esc_attr(join(' ', $post_class)) . '"><a href="#' . $post_slug . '">' . get_the_title() . '</a></li>';
- }
- wp_reset_postdata();
- echo '</ul></li>';
- }
- }
- echo $after_widget;
- }
- }
-
- /**
- * custom events calender widget
- * =============================
- * requires the post-type "events" with custom fields:
- * -_date-end
- * -_date-begin
- */
- class sandbox_events_widget extends WP_Widget {
-
- public function __construct() {
- /* Widget settings. */
- $widget_ops = array('classname' => 'events-calendar', 'description' => 'Test um zu schauen ob ich ein widget basteln kann.');
-
- /* Widget control settings. */
- $control_ops = array('width' => 300, 'height' => 350, 'id_base' => 'custom-events-calendar');
-
- /* Create the widget. */
- parent::__construct('custom-events-calendar', 'Nächste Termine', $widget_ops, $control_ops );
- }
-
- // processes widget options to be saved
- public function update($new_instance, $old_instance) {
- $instance = $old_instance;
- $instance['title'] = strip_tags( $new_instance['title'] );
- $instance['eventtype'] = $new_instance['eventtype'];
- $instance['maximum'] = intval($new_instance['maximum']);
- $instance['want_excerpt'] = filter_var($new_instance['want_excerpt'], FILTER_VALIDATE_BOOLEAN);
-
- return $instance;
- }
-
- // outputs the content of the widget
- public function widget($args, $instance) {
- sandbox_events($args, $instance);
- }
-
- // outputs the options form on admin
- public function form($instance) {
- $title = esc_attr($instance['title']);
- $eventtypes = get_terms('eventtypen');
- $maximum = esc_attr($instance['maximum']);
- $want_excerpt = esc_attr($instance['want_excerpt']);
- ?>
- <p>
- <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', 'sandbox'); ?></label>
- <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
- </p>
- <p>
- <label for="<?php echo $this->get_field_id('eventtype'); ?>"><?php _e('Event-Typ:', 'sandbox'); ?></label>
- <select class="widefat" id="<?php echo $this->get_field_id('eventtype'); ?>" name="<?php echo $this->get_field_name('eventtype'); ?>">
- <?php foreach ($eventtypes as $eventtype){ ?>
- <option value="<?php echo $eventtype->slug; ?>"<?php if ( $instance['eventtype'] == $eventtype->slug ) { echo ' selected="selected"'; } ?>><?php echo $eventtype->name; ?></option>
- <?php } ?>
- </select>
- </p>
- <p>
- <label for="<?php echo $this->get_field_id('maximum'); ?>"><?php _e('Maximum:', 'sandbox'); ?></label>
- <input class="widefat" id="<?php echo $this->get_field_id('maximum'); ?>" name="<?php echo $this->get_field_name('maximum'); ?>" type="text" value="<?php echo $maximum; ?>" />
- </p>
- <p>
- <input class="checkbox" type="checkbox" value="true" <?php checked( 1, $want_excerpt ); ?> id="<?php echo $this->get_field_id('want_excerpt'); ?>" name="<?php echo $this->get_field_name('want_excerpt'); ?>" />
- <label for="<?php echo $this->get_field_id('want_excerpt'); ?>"><?php _e('Auszug anzeigen', 'sandbox'); ?></label>
- </p>
- <?php
- }
- }
-
- function sandbox_events($args, $instance){
- extract($args);
-
- $title = apply_filters('widget_title', $instance['title'] );
- $max = $instance['maximum'];
- $index = 0;
- $eventsQuery = array(
- 'post_type' => 'events',
- 'order' => 'ASC',
- 'orderby' => 'meta_value',
- 'meta_key' => '_date-begin',
- 'eventtypen' => $instance['eventtype'],
- 'posts_per_page' => 100,
- );
- $events = new WP_Query($eventsQuery);
- $want_excerpt = $instance['want_excerpt'];
-
- if ( $events->have_posts() ) {
- echo $before_widget;
- if ( $title ) { echo $before_title . $title . $after_title; }
- echo '<ul class="events events-widget">';
- while ( $events->have_posts() ) {
- $events->the_post();
- if ( $index < $max ) {
- $event_meta = get_post_meta(get_the_ID());
- $target_day = isset($event_meta["_date-end"][0]) && is_string($event_meta["_date-end"][0]) && strlen($event_meta["_date-end"][0]) > 0 ? $event_meta["_date-end"][0] : $event_meta["_date-begin"][0];
- $current_date = $date = date('Y-m-d', time());
-
- // DEBUG
- // echo '<!-- title:', get_the_title(), ', max: ', $max, ', index: ', $index + 1, ' -->';
- // echo '<!-- title:', get_the_title(), ' ', $current_date, ' lte ', $target_day, ' === ', var_dump( $current_date <= $target_day ), ' -->';
- if ( $current_date <= $target_day ) {
- $index++;
- $begin_dayDisplay = date("j. n.", strtotime($event_meta["_date-begin"][0]));
- $begin_yearDisplay = date("Y", strtotime($event_meta["_date-begin"][0]));
- ?>
- <li <?php post_class('clearfix'); ?>>
- <aside class="meta"><p class="date"><span class="day"><?php echo $begin_dayDisplay; ?></span> <span class="year"><?php echo $begin_yearDisplay; ?></span></p></aside>
- <h4><a href="<?php the_permalink() ?>"><span class="entry-title"><?php the_title() ?></span></a></h4>
- <?php if ( $want_excerpt && has_excerpt() ) { ?>
- <div class="entry-summary">
- <?php the_excerpt(); ?>
- </div>
- <?php } ?>
- </li>
- <?php
- }
- }
- }
- echo '</ul>';
- echo $after_widget;
- }
- wp_reset_postdata();
- }
-
- /**
- * custom social share widget
- * ==========================
- * No user tracking, no javascript.
- *
- * - to use in your themes function.php
- * - edit the markup of the widget at sandbox_social();
- * - add your services at update()
- * - Service adresses are hardcoded and can change during time
- * - Add the CSS part of this file in yourThemes style.css
- */
- class sandbox_social_widget extends WP_Widget {
- public function __construct() {
- /* Widget settings. */
- $widget_ops = array('classname' => 'social', 'description' => 'Display social share icons without automatic user tracking');
- /* Widget control settings. */
- $control_ops = array('width' => 300, 'height' => 350, 'id_base' => 'social');
- /* Create the widget. */
- parent::__construct('social', 'Social share', $widget_ops, $control_ops );
- }
- // processes widget options to be saved
- public function update($new_instance, $old_instance) {
- $new_instance = (array) $new_instance;
- $instance = array(
- 'title' => strip_tags( $new_instance['title'] ),
- 'services' => array(
- 'xing' => array(
- 'name' => 'XING',
- 'url' => 'https://www.xing.com/spi/shares/new?url=',
- ),
- 'facebook' => array(
- 'name' => 'Facebook',
- 'url' => 'https://www.facebook.com/sharer/sharer.php?u=',
- ),
- 'twitter' => array(
- 'name' => 'Twitter',
- 'url' => 'http://twitter.com/share?url=',
- ),
- 'googleplus' => array(
- 'name' => 'Google+',
- 'url' => 'https://plus.google.com/share?url=',
- ),
- 'linkedin' => array(
- 'name' => 'LinkedIn',
- 'url' => 'http://www.linkedin.com/sharer.php?u=',
- ),
- 'pinterest' => array(
- 'name' => 'Pinterest',
- 'url' => 'http://www.pinterest.com/pin/create/bookmarklet/?url=',
- ),
- 'email' => array(
- 'name' => 'Email',
- 'url' => 'mailto:?subject=' . __('Teilen mit', 'sandbox') . ' ' . wp_get_document_title() . '&body=',
- ),
- ),
- );
- foreach ( $instance['services'] as $serviceName => $serviceData ) {
- $instance[$serviceName] = filter_var($new_instance[$serviceName], FILTER_VALIDATE_BOOLEAN);
- }
- return $instance;
- }
- // outputs the content of the widget
- public function widget($args, $instance) {
- sandbox_social($args, $instance);
- }
- // outputs the options form on admin
- public function form($instance) {
- $defaults = array('facebook' => true, 'twitter' => true, 'googleplus' => true, 'linkedin' => false);
- $services = $instance['services'];
- $instance = wp_parse_args( (array) $instance, $defaults);
- $title = esc_attr($instance['title']);
- ?>
- <p>
- <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', 'sandbox'); ?></label>
- <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
- </p>
- <?php foreach ( $services as $serviceName => $serviceData ) { ?>
- <p>
- <input class="checkbox" value="true" type="checkbox" id="<?php echo $this->get_field_id($serviceName); ?>" name="<?php echo $this->get_field_name($serviceName); ?>" <?php checked($instance[$serviceName], true) ?> />
- <label for="<?php echo $this->get_field_id($serviceName); ?>"><?php echo $serviceData['name']; ?></label>
- </p>
- <?php } ?>
- <?php
- }
- }
- function sandbox_social($args, $instance){
- extract($args);
- $title = apply_filters('widget_title', $instance['title'] );
- $services = $instance['services'];
- $protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === false ? 'http' : 'https';
- $host = $_SERVER["HTTP_HOST"];
- $path = $_SERVER["REQUEST_URI"];
- $pageUrl = $protocol . '://' . $host . $path;
- $servicesCount = 0;
- $servicesList = '';
- foreach ( $services as $serviceName => $serviceData ) {
- if ( $instance[$serviceName] ) {
- $servicesCount++;
- $servicesList .= '<li class="' . $serviceName . '"><a href="' . esc_url($serviceData["url"], ( $serviceName === 'email' ? 'mailto' : 'https' ) ) . $pageUrl . '" target="_blank" title="' . __('Teilen mit', 'sandbox') . ' ' . $serviceData["name"] . '">' . $serviceData["name"] . '</a></li>';
- }
- }
- if ( $servicesCount > 0 ) {
- echo $before_widget;
- ?>
- <div class="social">
- <?php if ( !empty($title) ) { echo $before_title . $title . $after_title; } ?>
- <ul>
- <?php echo $servicesList; ?>
- </ul>
- </div>
- <?php
- echo $after_widget;
- }
- }
-
- /**
- * custom slider widget
- */
- class sandbox_slider_widget extends WP_Widget {
-
- function __construct() {
- /* Widget settings. */
- $widget_ops = array('classname' => 'slider', 'description' => 'Select a slider to display');
-
- /* Widget control settings. */
- $control_ops = array('width' => 300, 'height' => 350, 'id_base' => 'slider');
-
- /* Create the widget. */
- parent::__construct('slider', 'Slider', $widget_ops, $control_ops );
-
- }
-
- // processes widget options to be saved
- public function update($new_instance, $old_instance) {
-
- $instance = $old_instance;
- $instance['title'] = strip_tags( $new_instance['title'] );
- $instance['slider'] = $new_instance['slider'];
- $instance['show-titles'] = filter_var($new_instance['show-titles'], FILTER_VALIDATE_BOOLEAN);
- $instance['show-content'] = filter_var($new_instance['show-content'], FILTER_VALIDATE_BOOLEAN);
- $instance['show-excerpt'] = filter_var($new_instance['show-excerpt'], FILTER_VALIDATE_BOOLEAN);
-
- return $instance;
- }
-
- // outputs the content of the widget
- public function widget($args, $instance) {
- sandbox_slider($args, $instance);
- }
-
- // outputs the options form on admin
- public function form($instance) {
-
- $title = esc_attr($instance['title']);
- $sliders = get_terms('slider');
- ?>
- <p>
- <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', 'sandbox'); ?></label>
- <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
- </p>
- <p>
- <label for="<?php echo $this->get_field_id('slider'); ?>"><?php _e('Slider:', 'sandbox'); ?></label>
- <select class="widefat" id="<?php echo $this->get_field_id('slider'); ?>" name="<?php echo $this->get_field_name('slider'); ?>">
- <?php foreach ($sliders as $slider){ ?>
- <option value="<?php echo $slider->slug; ?>"<?php if ( $instance['slider'] == $eventtype->slug ) { echo ' selected="selected"'; } ?>><?php echo $slider->name; ?></option>
- <?php } ?>
- </select>
- </p>
- <p>
- <input class="checkbox" value="true" type="checkbox" id="<?php echo $this->get_field_id('show-titles'); ?>" name="<?php echo $this->get_field_name('show-titles'); ?>" <?php checked($instance['show-titles'], true) ?> />
- <label for="<?php echo $this->get_field_id('show-titles'); ?>"><?php echo 'Show titles'; ?></label>
- </p>
- <p>
- <input class="checkbox" value="true" type="checkbox" id="<?php echo $this->get_field_id('show-content'); ?>" name="<?php echo $this->get_field_name('show-content'); ?>" <?php checked($instance['show-content'], true) ?> />
- <label for="<?php echo $this->get_field_id('show-content'); ?>"><?php echo 'Show content'; ?></label>
- </p>
- <p>
- <input class="checkbox" value="true" type="checkbox" id="<?php echo $this->get_field_id('show-excerpt'); ?>" name="<?php echo $this->get_field_name('show-excerpt'); ?>" <?php checked($instance['show-excerpt'], true) ?> />
- <label for="<?php echo $this->get_field_id('show-excerpt'); ?>"><?php echo 'Show excerpt'; ?></label>
- </p>
- <?php
- }
- }
- function sandbox_slider($args, $instance){
- extract($args);
-
- $title = apply_filters('widget_title', $instance['title']);
- $sliderQuery = array(
- 'post_type' => 'slide',
- 'order' => 'ASC',
- 'orderby' => 'menu_order',
- 'slider' => $instance['slider']
- );
- $slider = new WP_Query($sliderQuery);
- $sliderCount = 0;
- $sliderNav = '<ul class="slider-nav">';
- $sliderId = $slider->query_vars['taxonomy'] . '-' . $slider->query_vars['term'];
- $sliderClass = $slider->query_vars['taxonomy'];
- $show_titles = filter_var($instance['show-titles'], FILTER_VALIDATE_BOOLEAN);
- $show_content = filter_var($instance['show-content'], FILTER_VALIDATE_BOOLEAN);
- $show_excerpt = filter_var($instance['show-excerpt'], FILTER_VALIDATE_BOOLEAN);
-
- if ( $slider->have_posts() ) {
-
- echo $before_widget;
- echo '<section class="', $sliderClass, ' ', $sliderId, '" id="', $sliderId, '">';
- if ( $title ){ echo $before_title . $title . $after_title; }
- echo ' <ul class="slides clearfix">';
-
- while ( $slider->have_posts() ) { $slider->the_post();
-
- $slideId = get_post_field('post_name', get_the_ID() );
- $sliderCount++;
- $sliderNav .= '<li><a href="#slide-' . $slideId . '">' . $sliderCount . '</a></li>';
- $sliderImage = get_the_post_thumbnail(get_the_ID(), 'slider', array('title' => the_title_attribute('echo=0')));
- $sliderMeta = get_post_meta( get_the_ID() );
- $the_content = $show_content ? get_the_content() : $show_content;
- $has_content = !empty(trim(str_replace(' ', '', strip_tags($the_content))));
-
- // echo var_dump($sliderMeta["slider-link"][0]);
- ?>
- <li id="slide-<?php echo $slideId ?>" class="slide slide-<?php echo $slideId ?> slide-<?php echo $sliderCount ?> clearfix">
- <?php echo $sliderImage; ?>
- <?php if ( $show_titles || $show_excerpt || $show_content ) { ?>
- <div class="inner">
- <?php if ( $show_titles ) { ?>
- <h3><?php the_title(); ?></h3>
- <?php } ?>
- <?php if ( $show_content && $has_content ) { ?>
- <div class="content">
- <?php the_content(); ?>
- </div>
- <?php } ?>
- <?php if ( $show_excerpt && has_excerpt() ) { ?>
- <div class="content excerpt">
- <?php the_excerpt(); ?>
- </div>
- <?php } ?>
- </div>
- <?php } ?>
- </li>
- <?php
- }
- echo '</ul>';
-
- $sliderNav .= '</ul>';
-
- echo $sliderNav;
- echo '</section>';
- echo $after_widget;
- }
- wp_reset_postdata();
- }
-
- ?>
|