functions.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. <?php
  2. /* test */
  3. remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
  4. remove_action( 'wp_print_styles', 'print_emoji_styles' );
  5. /* enqueue scripts and style from parent theme */
  6. function twentytwentyone_styles() {
  7. wp_enqueue_style( 'child-style', get_stylesheet_uri(),
  8. array( 'twenty-twenty-one-style' ), wp_get_theme()->get('Version') );
  9. }
  10. add_action( 'wp_enqueue_scripts', 'twentytwentyone_styles', 99);
  11. include 'postie-helper.php';
  12. add_filter(
  13. 'wp_sitemaps_posts_entry',
  14. function( $entry, $post ) {
  15. $entry['lastmod'] = $post->post_modified_gmt;
  16. return $entry;
  17. },
  18. 10,
  19. 2
  20. );
  21. // disable taxonomy sitemap
  22. function shapeSpace_disable_sitemap_taxonomy($taxonomies) {
  23. unset($taxonomies['post_tag']); // can be post_tag, category, post_format, or any taxonomy
  24. unset($taxonomies['post_format']); // can be post_tag, category, post_format, or any taxonomy
  25. return $taxonomies;
  26. }
  27. add_filter('wp_sitemaps_taxonomies', 'shapeSpace_disable_sitemap_taxonomy');
  28. // disable users sitemap
  29. function shapeSpace_disable_sitemap_users($provider, $name) {
  30. return ($name == 'users') ? false : $provider;
  31. }
  32. add_filter('wp_sitemaps_add_provider', 'shapeSpace_disable_sitemap_users', 10, 2);
  33. // disable post type sitemap
  34. function shapeSpace_disable_sitemap_post_types($post_types) {
  35. unset($post_types['page']); // can be post, page, or any post type
  36. return $post_types;
  37. }
  38. add_filter('wp_sitemaps_post_types', 'shapeSpace_disable_sitemap_post_types');
  39. /* https://firstsiteguide.com/wordpress-titles/ */
  40. function wploop_change_separator() {
  41. return '//';
  42. }
  43. add_filter('document_title_separator', 'wploop_change_separator');
  44. /* -- https://wordpress.stackexchange.com/questions/240221/modify-page-title-format-when-using-title-tag */
  45. add_filter( 'document_title_parts', function( $title_parts_array ) {
  46. if ( get_the_ID() == 31286 ) {
  47. $title_parts_array['title'] = 'Markus Spring Photography';
  48. } else {
  49. $title_parts_array['site'] = str_replace('spring2life', 'Markus Spring Photography',
  50. $title_parts_array['site']);
  51. }
  52. return $title_parts_array;
  53. }, 10, 2 );
  54. /* Basic WP SEO
  55. Usage:
  56. 1. add this code to functions.php
  57. 2. replace the $default_keywords with your own
  58. 3. add <?php echo basic_wp_seo(); ?> to header.php
  59. 4. test well and fine tune as needed
  60. Optional: add custom description, keywords, and/or title
  61. to any post or page using these custom field keys:
  62. mm_seo_desc
  63. mm_seo_keywords
  64. mm_seo_title
  65. To migrate from any SEO plugin, replace its custom field
  66. keys with those listed above. More information:
  67. @ https://digwp.com/2013/08/basic-wp-seo/
  68. */
  69. function wp_seo_get_description ($post) {
  70. // description
  71. $seo_desc = get_post_meta($post->ID, 'mm_seo_desc', true);
  72. $description = get_bloginfo('description', 'display');
  73. $pagedata = get_post($post->ID);
  74. if (is_singular()) {
  75. if (!empty($seo_desc)) {
  76. $content = $seo_desc;
  77. } else if (!empty($pagedata)) {
  78. $content = apply_filters('the_excerpt_rss', $pagedata->post_content);
  79. $content = substr(trim(strip_tags($content)), 0, 155);
  80. $content = preg_replace('#\n#', ' ', $content);
  81. $content = preg_replace('#\s{2,}#', ' ', $content);
  82. $content = trim($content);
  83. }
  84. } else {
  85. $content = $description;
  86. }
  87. return esc_attr($content);
  88. }
  89. function wp_seo_get_keywords ($post) {
  90. // keywords
  91. $default_keywords = 'Markus Spring, spring2life, Fotografie, photography, fotoblog, photoblog'; // customize
  92. $keys = get_post_meta($post->ID, 'mm_seo_keywords', true);
  93. $cats = get_the_category();
  94. $tags = get_the_tags();
  95. if (empty($keys)) {
  96. if (!empty($cats)) foreach($cats as $cat) $keys .= $cat->name . ', ';
  97. if (!empty($tags)) foreach($tags as $tag) $keys .= $tag->name . ', ';
  98. $keys .= $default_keywords;
  99. }
  100. return esc_attr($keys);
  101. }
  102. function basic_wp_seo() {
  103. global $page, $paged, $post;
  104. $default_keywords = 'Markus Spring, spring2life, Fotografie, photography, fotoblog, photoblog'; // customize
  105. $output = '';
  106. $output .= '<meta name="description" content="' . wp_seo_get_description($post) . '">' . "\n";
  107. $output .= "\t\t" . '<meta name="keywords" content="' . wp_seo_get_keywords($post) . '">' . "\n";
  108. // robots
  109. if (is_category() || is_tag()) {
  110. $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
  111. if ($paged > 1) {
  112. $output .= "\t\t" . '<meta name="robots" content="noindex,follow">' . "\n";
  113. } else {
  114. $output .= "\t\t" . '<meta name="robots" content="index,follow">' . "\n";
  115. }
  116. } else if (is_home() || is_singular()) {
  117. $output .= "\t\t" . '<meta name="robots" content="index,follow">' . "\n";
  118. } else {
  119. $output .= "\t\t" . '<meta name="robots" content="noindex,follow">' . "\n";
  120. }
  121. // title
  122. $title_custom = get_post_meta($post->ID, 'mm_seo_title', true);
  123. $url = ltrim(esc_url($_SERVER['REQUEST_URI']), '/');
  124. $name = get_bloginfo('name', 'display');
  125. $title = trim(wp_title('', false));
  126. $cat = single_cat_title('', false);
  127. $tag = single_tag_title('', false);
  128. $search = get_search_query();
  129. if (!empty($title_custom)) $title = $title_custom;
  130. if ($paged >= 2 || $page >= 2) $page_number = ' | ' . sprintf('Page %s', max($paged, $page));
  131. else $page_number = '';
  132. if (is_home() || is_front_page()) $seo_title = $name . ' | ' . $description;
  133. elseif (is_singular()) $seo_title = $title . ' | ' . $name;
  134. elseif (is_tag()) $seo_title = 'Tag Archive: ' . $tag . ' | ' . $name;
  135. elseif (is_category()) $seo_title = 'Category Archive: ' . $cat . ' | ' . $name;
  136. elseif (is_archive()) $seo_title = 'Archive: ' . $title . ' | ' . $name;
  137. elseif (is_search()) $seo_title = 'Search: ' . $search . ' | ' . $name;
  138. elseif (is_404()) $seo_title = '404 - Not Found: ' . $url . ' | ' . $name;
  139. else $seo_title = $name . ' | ' . $description;
  140. $output .= "\t\t" . '<title>' . esc_attr($seo_title . $page_number) . '</title>' . "\n";
  141. // OpenGraph
  142. $permalink = get_permalink($post->ID);
  143. $output .= '<meta property="og:locale" content="en_GB" />' . "\n";
  144. $output .= "<meta property='og:url' content='$permalink'>\n";
  145. $output .= "<meta property='og:type' content='article'> \n";
  146. $output .= "<meta property='og:title' content='$title'> \n";
  147. $output .= "<meta property='og:site_name' content='Markus Spring Photography // spring2life'> \n";
  148. $output .= "<meta property='og:description' content='$title | Markus Spring Photography'>\n";
  149. $output .= "<meta property='og:image' content='" . get_post_image($post->ID) . "'> \n";
  150. // <meta property="article:modified_time" content="2021-03-16T20:48:44+00:00" />
  151. /* echo "<!-- " . print_r($image_attributes) . " -->\n"; */
  152. return $output;
  153. }
  154. function get_post_image ($postID)
  155. {
  156. $args = array(
  157. 'numberposts' => 1,
  158. 'order'=> 'ASC',
  159. 'post_mime_type' => 'image',
  160. 'post_parent' => $postID,
  161. 'post_status' => null,
  162. 'post_type' => 'attachment'
  163. );
  164. $attachments = get_children( $args );
  165. //print_r($attachments);
  166. if ($attachments) {
  167. foreach($attachments as $attachment) {
  168. $image_attributes = wp_get_attachment_image_src( $attachment->ID, 'full' );
  169. /* echo "<!-- " . print_r($image_attributes) . " -->\n"; */
  170. return $image_attributes[0];
  171. }
  172. }
  173. }
  174. /* -------------------------------------------------- further cleanup --- */
  175. /* Disable emojicons introduced with WP 4.2 */
  176. /* from http://wordpress.stackexchange.com/questions/185577/disable-emojicons-introduced-with-wp-4-2 */
  177. function disable_wp_emojicons() {
  178. // all actions related to emojis
  179. remove_action( 'admin_print_styles', 'print_emoji_styles' );
  180. remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
  181. remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
  182. remove_action( 'wp_print_styles', 'print_emoji_styles' );
  183. remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
  184. remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
  185. remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
  186. // filter to remove TinyMCE emojis
  187. // add_filter( 'tiny_mce_plugins', 'disable_emojicons_tinymce' );
  188. }
  189. add_action( 'init', 'disable_wp_emojicons' );
  190. /* from https://wordpress.org/support/topic/remove-googlewebfonts */
  191. function remove_open_sans() {
  192. wp_dequeue_style( 'open-sans-web-font' );
  193. wp_deregister_style( 'open-sans-web-font' );
  194. }
  195. add_action( 'wp_enqueue_scripts', 'remove_open_sans', 25 );
  196. add_image_size( 'semilarge', 602, 0, false );
  197. add_image_size( 'old_old_large', 1100, 1100, false );
  198. add_filter( 'image_size_names_choose','miech_custom_image_sizes' );
  199. function miech_custom_image_sizes( $sizes ) {
  200. return array_merge( $sizes, array(
  201. 'semilarge' => 'SemiLarge',
  202. 'old_old_large' => 'Old_old_Large',
  203. ) );
  204. }
  205. /*-- ------------------------------ run postie get posts from admin bar --- --*/
  206. // https://markus-spring.info/wp-admin/admin.php?page=postie-settings&action=runpostie&Submit=Process+Email
  207. function webriti_toolbar_link($wp_admin_bar) {
  208. $args = array(
  209. 'id' => 'customlink',
  210. 'title' => 'Run Postie',
  211. 'href' => 'https://markus-spring.info/wp-admin/admin.php?page=postie-settings&action=runpostie&Submit=Process+Email',
  212. 'meta' => array(
  213. 'class' => 'customlink',
  214. 'title' => 'run Postie'
  215. )
  216. );
  217. $wp_admin_bar->add_node($args);
  218. }
  219. add_action('admin_bar_menu', 'webriti_toolbar_link', 999);
  220. add_action( 'pre_get_posts', 'prefix_category_query' );
  221. /**
  222. * Customize category query using pre_get_posts.
  223. *
  224. * @author FAT Media <http://youneedfat.com>
  225. * @copyright Copyright (c) 2013, FAT Media, LLC
  226. * @license GPL-2.0+
  227. * @todo Change prefix to theme or plugin prefix
  228. *
  229. */
  230. function prefix_category_query( $query ) {
  231. /* if ( $query->is_main_query() && ! $query->is_feed() && ! is_admin() && is_category() ) { */
  232. if ( $query->is_main_query() && ! $query->is_feed() && ! is_admin() && is_archive() ) {
  233. $query->set( 'posts_per_page', '40' ); //Change this number to anything you like.
  234. }
  235. }
  236. /* ----------------------------------- for manipulating the main loop --- */
  237. $miech_active_cat;
  238. function miech_get_active_cat ($id) {
  239. //_log("Querying active cat for $id");
  240. $my_query = new WP_Query('posts_per_page=1');
  241. while ( $my_query->have_posts() )
  242. $my_query->the_post();
  243. $featured_category_1 = get_theme_mod( 'featured_category_1', 'default_value' );
  244. $featured_category_2 = get_theme_mod( 'featured_category_2', 'default_value' );
  245. $do_not_duplicate = $id; //This is the magic line
  246. if (has_category ( $featured_category_1, $id)) { /* Featured Category 1 */
  247. $active_cat = $featured_category_1;
  248. } else {
  249. $active_cat = $featured_category_2; /* Featured Category 2 */
  250. }
  251. wp_reset_query();
  252. //_log("miech_get_active_cat: Active cat is $active_cat");
  253. return $active_cat;
  254. }
  255. function miech_set_active_cat ( $this_cat ) {
  256. global $miech_active_cat;
  257. if (have_posts()) {
  258. if ( $this_cat ) {
  259. $miech_active_cat = $this_cat;
  260. } else {
  261. $miech_active_cat = miech_get_active_cat($post->ID);
  262. }
  263. //error_log("miech_set_active_cat: miech_active_cat is $miech_active_cat");
  264. if ( get_query_var('paged') )
  265. { $paged = get_query_var('paged'); }
  266. elseif ( get_query_var('page') )
  267. { $paged = get_query_var('page'); }
  268. else
  269. { $paged = 1; }
  270. //error_log("paged: $paged");
  271. if ( is_single() )
  272. $posts_per_page = 1;
  273. else
  274. $posts_per_page = 25;
  275. query_posts( array(
  276. 'order' => 'DESC',
  277. 'paged' => $paged,
  278. 'cat' => $miech_active_cat,
  279. 'posts_per_page' => $posts_per_page
  280. ) );
  281. }
  282. }
  283. // turn Photon off so we can get the correct image
  284. $photon_removed = '';
  285. if ( class_exists( 'Jetpack' ) && Jetpack::is_module_active( 'photon' ) ) { // check that we are, in fact, using Photon in the first place
  286. $photon_removed = remove_filter( 'image_downsize', array( Jetpack_Photon::instance(), 'filter_image_downsize' ) );
  287. }
  288. /*
  289. Diverse Einstellungen für die functions.php (dort am Ende einfügen)
  290. von https://faq.netzprisma.de/wordpress-html-ausmisten/
  291. */
  292. // Diverse Einträge entfernen
  293. remove_action('wp_head', 'wp_generator');
  294. remove_action('wp_head', 'rsd_link');
  295. remove_action('wp_head', 'wlwmanifest_link');
  296. // Generator-Angaben, z.B. im Feed, entfernen
  297. function remove_wp_generator() { return ''; }
  298. add_filter('the_generator','remove_wp_generator');
  299. // // prev+next Links in Beiträgen entfernen
  300. // remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
  301. // // shortlink entfernen
  302. // remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0);
  303. // Post+Kommentar+Kategorie RSS Feed-Links entfernen (entfernt nicht die Feeds selbst)
  304. remove_action('wp_head', 'feed_links', 2);
  305. remove_action('wp_head', 'feed_links_extra', 3);
  306. // wp Versions-Parameter ?ver=... von Skripts entfernen, falls unsere WordPress-Version angegeben wird
  307. function vc_remove_wp_ver_css_js( $src )
  308. {
  309. if ( strpos($src, 'ver='. get_bloginfo('version') ) )
  310. $src = remove_query_arg('ver', $src);
  311. return $src;
  312. }
  313. add_filter('style_loader_src', 'vc_remove_wp_ver_css_js', 9999);
  314. add_filter('script_loader_src', 'vc_remove_wp_ver_css_js', 9999);
  315. // Emoji js, css und dns-preload entfernen
  316. remove_action('wp_head', 'print_emoji_detection_script', 7);
  317. remove_action('wp_print_styles', 'print_emoji_styles');
  318. add_filter('emoji_svg_url', '__return_false');
  319. // // REST Api Hinweise entfernen
  320. // remove_action('wp_head', 'rest_output_link_wp_head');
  321. // remove_action('wp_head', 'wp_oembed_add_discovery_links');
  322. // remove_action('template_redirect', 'rest_output_link_header', 11, 0);
  323. // function remove_json_api ()
  324. // {
  325. // // REST API Zeilen aus dem HTML Header entfernen
  326. // remove_action('wp_head', 'rest_output_link_wp_head', 10);
  327. // remove_action('wp_head', 'wp_oembed_add_discovery_links', 10);
  328. // // REST API endpoint entfernen
  329. // remove_action('rest_api_init', 'wp_oembed_register_route');
  330. // // oEmbed auto discovery entfernen
  331. // add_filter('embed_oembed_discover', '__return_false');
  332. // // oEmbed results nicht filtern
  333. // remove_filter('oembed_dataparse', 'wp_filter_oembed_result', 10);
  334. // // oEmbed discovery links entfernen
  335. // remove_action('wp_head', 'wp_oembed_add_discovery_links');
  336. // // oEmbed-JavaScript entfernen
  337. // remove_action('wp_head', 'wp_oembed_add_host_js');
  338. // // rewrite rules zum Einbetten entfernen
  339. // add_filter('rewrite_rules_array', 'disable_embeds_rewrites');
  340. // }
  341. // add_action('after_setup_theme', 'remove_json_api');