. */ 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) { ?>

Extra profile information


Please enter position at your organisation.

Please enter your LinkedIn username.
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 = ''; 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 .= '
  • ' . wp_loginout(get_permalink(), false) . '
  • '; } } 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 = '
  • ' . wp_loginout(get_permalink(), false) . '
  • ' . $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(); ?> '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']); ?>

    '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 '