__('Primary Menu', 'duck-behavior-journal'), 'footer' => __('Footer Menu', 'duck-behavior-journal'), )); add_theme_support('custom-logo'); add_theme_support('custom-header', array( 'default-image' => get_template_directory_uri() . '/assets/img/hero.png', 'width' => 1920, 'height' => 1080, 'flex-height' => true, 'flex-width' => true, )); add_theme_support('pagination'); } add_action('after_setup_theme', 'duck_behavior_journal_setup'); function duck_behavior_journal_scripts() { wp_enqueue_style('bootstrap-css', get_template_directory_uri() . '/assets/dist/css/bootstrap.min.css'); wp_enqueue_style('mathjax-css', get_template_directory_uri() . '/assets/dist/css/mathjax.css'); wp_enqueue_style('theme-style', get_stylesheet_uri()); wp_enqueue_script('jquery', get_template_directory_uri() . '/assets/dist/js/jquery-3.7.1.min.js', array(), null, true); wp_enqueue_script('bootstrap-js', get_template_directory_uri() . '/assets/dist/js/bootstrap.bundle.min.js', array(), null, true); } add_action('wp_enqueue_scripts', 'duck_behavior_journal_scripts'); require_once get_template_directory() . '/class-wp-bootstrap-navwalker.php'; function duck_behavior_journal_customizer($wp_customize) { // Hero Image Section $wp_customize->add_section('hero_image_section', array( 'title' => __('Hero Section', 'duck-behavior-journal'), 'priority' => 30, )); // Hero Image Setting $wp_customize->add_setting('hero_image', array( 'default' => get_template_directory_uri() . '/assets/img/hero.png', 'transport' => 'refresh', )); $wp_customize->add_control(new WP_Customize_Image_Control($wp_customize, 'hero_image_control', array( 'label' => __('Hero Image', 'duck-behavior-journal'), 'section' => 'hero_image_section', 'settings' => 'hero_image', ))); // Hero Title Setting $wp_customize->add_setting('hero_title', array( 'default' => 'Advancing the Understanding of Duck Behavior', 'transport' => 'refresh', )); $wp_customize->add_control('hero_title_control', array( 'label' => __('Hero Title', 'duck-behavior-journal'), 'section' => 'hero_image_section', 'settings' => 'hero_title', 'type' => 'text', )); // Hero Subtitle Setting $wp_customize->add_setting('hero_subtitle', array( 'default' => 'Through Rigorous Scientific Research', 'transport' => 'refresh', )); $wp_customize->add_control('hero_subtitle_control', array( 'label' => __('Hero Subtitle', 'duck-behavior-journal'), 'section' => 'hero_image_section', 'settings' => 'hero_subtitle', 'type' => 'text', )); // Hero Primary Button Text Setting $wp_customize->add_setting('hero_primary_button_text', array( 'default' => 'Submit Your Research', 'transport' => 'refresh', )); $wp_customize->add_control('hero_primary_button_text_control', array( 'label' => __('Hero Primary Button Text', 'duck-behavior-journal'), 'section' => 'hero_image_section', 'settings' => 'hero_primary_button_text', 'type' => 'text', )); // Hero Primary Button URL Setting $wp_customize->add_setting('hero_primary_button_url', array( 'default' => '#', 'transport' => 'refresh', )); $wp_customize->add_control('hero_primary_button_url_control', array( 'label' => __('Hero Primary Button URL', 'duck-behavior-journal'), 'section' => 'hero_image_section', 'settings' => 'hero_primary_button_url', 'type' => 'url', )); // Hero Secondary Button Text Setting $wp_customize->add_setting('hero_secondary_button_text', array( 'default' => 'Subscribe to the Journal', 'transport' => 'refresh', )); $wp_customize->add_control('hero_secondary_button_text_control', array( 'label' => __('Hero Secondary Button Text', 'duck-behavior-journal'), 'section' => 'hero_image_section', 'settings' => 'hero_secondary_button_text', 'type' => 'text', )); // Hero Secondary Button URL Setting $wp_customize->add_setting('hero_secondary_button_url', array( 'default' => '#', 'transport' => 'refresh', )); $wp_customize->add_control('hero_secondary_button_url_control', array( 'label' => __('Hero Secondary Button URL', 'duck-behavior-journal'), 'section' => 'hero_image_section', 'settings' => 'hero_secondary_button_url', 'type' => 'url', )); // Footer Section $wp_customize->add_section('footer_section', array( 'title' => __('Footer', 'duck-behavior-journal'), 'priority' => 40, )); // Footer Text Setting $wp_customize->add_setting('footer_text', array( 'default' => '© ' . date('Y') . ' Duck Behavior Journal. All rights reserved.', 'transport' => 'refresh', )); $wp_customize->add_control('footer_text_control', array( 'label' => __('Footer Text', 'duck-behavior-journal'), 'section' => 'footer_section', 'settings' => 'footer_text', 'type' => 'textarea', )); // Footer Social Media Links $social_media = array('facebook', 'twitter', 'linkedin'); foreach ($social_media as $platform) { $wp_customize->add_setting("footer_{$platform}_link", array( 'default' => '#', 'transport' => 'refresh', )); $wp_customize->add_control("footer_{$platform}_link_control", array( 'label' => __(ucfirst($platform) . ' URL', 'duck-behavior-journal'), 'section' => 'footer_section', 'settings' => "footer_{$platform}_link", 'type' => 'url', )); } // DOI Prefix Section $wp_customize->add_section('doi_prefix_section', array( 'title' => __('DOI Prefix', 'duck-behavior-journal'), 'priority' => 50, )); $wp_customize->add_setting('doi_prefix', array( 'default' => '22.2222/DBJ/', 'transport' => 'refresh', )); $wp_customize->add_control('doi_prefix_control', array( 'label' => __('DOI Prefix', 'duck-behavior-journal'), 'section' => 'doi_prefix_section', 'settings' => 'doi_prefix', 'type' => 'text', )); } add_action('customize_register', 'duck_behavior_journal_customizer'); function create_article_post_type() { $labels = array( 'name' => _x('Articles', 'Post type general name', 'duck-behavior-journal'), 'singular_name' => _x('Article', 'Post type singular name', 'duck-behavior-journal'), 'menu_name' => _x('Articles', 'Admin Menu text', 'duck-behavior-journal'), 'name_admin_bar' => _x('Article', 'Add New on Toolbar', 'duck-behavior-journal'), 'add_new' => __('Add New', 'duck-behavior-journal'), 'add_new_item' => __('Add New Article', 'duck-behavior-journal'), 'new_item' => __('New Article', 'duck-behavior-journal'), 'edit_item' => __('Edit Article', 'duck-behavior-journal'), 'view_item' => __('View Article', 'duck-behavior-journal'), 'all_items' => __('All Articles', 'duck-behavior-journal'), 'search_items' => __('Search Articles', 'duck-behavior-journal'), 'parent_item_colon' => __('Parent Articles:', 'duck-behavior-journal'), 'not_found' => __('No articles found.', 'duck-behavior-journal'), 'not_found_in_trash' => __('No articles found in Trash.', 'duck-behavior-journal'), 'featured_image' => _x('Featured Image', 'Overrides the “Featured Image” phrase for this post type. Added in 4.3', 'duck-behavior-journal'), 'set_featured_image' => _x('Set featured image', 'Overrides the “Set featured image” phrase for this post type. Added in 4.3', 'duck-behavior-journal'), 'remove_featured_image' => _x('Remove featured image', 'Overrides the “Remove featured image” phrase for this post type. Added in 4.3', 'duck-behavior-journal'), 'use_featured_image' => _x('Use as featured image', 'Overrides the “Use as featured image” phrase for this post type. Added in 4.3', 'duck-behavior-journal'), 'archives' => _x('Article archives', 'The post type archive label used in nav menus. Default “Post Archives”. Added in 4.4', 'duck-behavior-journal'), 'insert_into_item' => _x('Insert into article', 'Overrides the “Insert into post”/”Insert into page” phrase (used when inserting media into a post). Added in 4.4', 'duck-behavior-journal'), 'uploaded_to_this_item' => _x('Uploaded to this article', 'Overrides the “Uploaded to this post”/”Uploaded to this page” phrase (used when viewing media attached to a post). Added in 4.4', 'duck-behavior-journal'), 'filter_items_list' => _x('Filter articles list', 'Screen reader text for the filter links heading on the post type listing screen. Default “Filter posts list”/”Filter pages list”. Added in 4.4', 'duck-behavior-journal'), 'items_list_navigation' => _x('Articles list navigation', 'Screen reader text for the pagination heading on the post type listing screen. Default “Posts list navigation”/”Pages list navigation”. Added in 4.4', 'duck-behavior-journal'), 'items_list' => _x('Articles list', 'Screen reader text for the items list heading on the post type listing screen. Default “Posts list”/”Pages list”. Added in 4.4', 'duck-behavior-journal'), ); $args = array( 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array('slug' => 'article'), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'), ); register_post_type('article', $args); } add_action('init', 'create_article_post_type'); function create_publication_status_taxonomy() { $labels = array( 'name' => _x('Publication Statuses', 'taxonomy general name', 'duck-behavior-journal'), 'singular_name' => _x('Publication Status', 'taxonomy singular name', 'duck-behavior-journal'), 'search_items' => __('Search Publication Statuses', 'duck-behavior-journal'), 'all_items' => __('All Publication Statuses', 'duck-behavior-journal'), 'parent_item' => __('Parent Publication Status', 'duck-behavior-journal'), 'parent_item_colon' => __('Parent Publication Status:', 'duck-behavior-journal'), 'edit_item' => __('Edit Publication Status', 'duck-behavior-journal'), 'update_item' => __('Update Publication Status', 'duck-behavior-journal'), 'add_new_item' => __('Add New Publication Status', 'duck-behavior-journal'), 'new_item_name' => __('New Publication Status Name', 'duck-behavior-journal'), 'menu_name' => __('Publication Status', 'duck-behavior-journal'), ); $args = array( 'hierarchical' => true, 'labels' => $labels, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, 'rewrite' => array('slug' => 'publication-status'), ); register_taxonomy('publication_status', array('article'), $args); } add_action('init', 'create_publication_status_taxonomy', 0); // Add color picker to publication status taxonomy function add_publication_status_color_field($term) { $color = get_term_meta($term->term_id, 'publication_status_color', true); ?>

term_id, 'publication_status_color', true); $color_style = $color ? ' style="color:' . esc_attr($color) . ';"' : ''; echo '' . esc_html($term->name) . ' '; } } } function add_article_meta_boxes() { add_meta_box( 'article_authors', __('Article Authors', 'duck-behavior-journal'), 'render_article_authors_meta_box', 'article', 'side', 'default' ); add_meta_box( 'article_doi', __('Article DOI', 'duck-behavior-journal'), 'render_article_doi_meta_box', 'article', 'side', 'default' ); add_meta_box( 'article_attachment', __('File Attachment', 'duck-behavior-journal'), 'render_article_attachment_meta_box', 'article', 'side', 'default' ); add_meta_box( 'article_open_access', __('Open Access', 'duck-behavior-journal'), 'render_article_open_access_meta_box', 'article', 'side', 'default' ); } add_action('add_meta_boxes', 'add_article_meta_boxes'); function render_article_authors_meta_box($post) { $authors = get_post_meta($post->ID, 'article_authors', true); ?>
$author) { ?>

ID, 'article_doi', true); $doi_prefix = get_theme_mod('doi_prefix', '22.2222/DBJ/'); ?>

ID, 'article_attachment_id', true); $attachment_url = $attachment_id ? wp_get_attachment_url($attachment_id) : ''; ?>

ID, 'article_open_access', true); ?>

query_vars['doi'])) { $doi = $query->query_vars['doi']; $args = array( 'post_type' => 'article', 'meta_query' => array( array( 'key' => 'article_doi', 'value' => $doi, 'compare' => '=' ) ) ); $articles = new WP_Query($args); if ($articles->have_posts()) { $articles->the_post(); wp_redirect(get_permalink(), 301); exit; } } } add_action('parse_query', 'redirect_doi_to_article'); function create_letter_post_type() { $labels = array( 'name' => _x('Letters to the Editor', 'Post type general name', 'duck-behavior-journal'), 'singular_name' => _x('Letter to the Editor', 'Post type singular name', 'duck-behavior-journal'), 'menu_name' => _x('Letters to the Editor', 'Admin Menu text', 'duck-behavior-journal'), 'name_admin_bar' => _x('Letter to the Editor', 'Add New on Toolbar', 'duck-behavior-journal'), 'add_new' => __('Add New', 'duck-behavior-journal'), 'add_new_item' => __('Add New Letter', 'duck-behavior-journal'), 'new_item' => __('New Letter', 'duck-behavior-journal'), 'edit_item' => __('Edit Letter', 'duck-behavior-journal'), 'view_item' => __('View Letter', 'duck-behavior-journal'), 'all_items' => __('All Letters', 'duck-behavior-journal'), 'search_items' => __('Search Letters', 'duck-behavior-journal'), 'parent_item_colon' => __('Parent Letters:', 'duck-behavior-journal'), 'not_found' => __('No letters found.', 'duck-behavior-journal'), 'not_found_in_trash' => __('No letters found in Trash.', 'duck-behavior-journal'), 'featured_image' => _x('Featured Image', 'Overrides the “Featured Image” phrase for this post type. Added in 4.3', 'duck-behavior-journal'), 'set_featured_image' => _x('Set featured image', 'Overrides the “Set featured image” phrase for this post type. Added in 4.3', 'duck-behavior-journal'), 'remove_featured_image' => _x('Remove featured image', 'Overrides the “Remove featured image” phrase for this post type. Added in 4.3', 'duck-behavior-journal'), 'use_featured_image' => _x('Use as featured image', 'Overrides the “Use as featured image” phrase for this post type. Added in 4.3', 'duck-behavior-journal'), 'archives' => _x('Letter archives', 'The post type archive label used in nav menus. Default “Post Archives”. Added in 4.4', 'duck-behavior-journal'), 'insert_into_item' => _x('Insert into letter', 'Overrides the “Insert into post”/”Insert into page” phrase (used when inserting media into a post). Added in 4.4', 'duck-behavior-journal'), 'uploaded_to_this_item' => _x('Uploaded to this letter', 'Overrides the “Uploaded to this post”/”Uploaded to this page” phrase (used when viewing media attached to a post). Added in 4.4', 'duck-behavior-journal'), 'filter_items_list' => _x('Filter letters list', 'Screen reader text for the filter links heading on the post type listing screen. Default “Filter posts list”/”Filter pages list”. Added in 4.4', 'duck-behavior-journal'), 'items_list_navigation' => _x('Letters list navigation', 'Screen reader text for the pagination heading on the post type listing screen. Default “Posts list navigation”/”Pages list navigation”. Added in 4.4', 'duck-behavior-journal'), 'items_list' => _x('Letters list', 'Screen reader text for the items list heading on the post type listing screen. Default “Posts list”/”Pages list”. Added in 4.4', 'duck-behavior-journal'), ); $args = array( 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array('slug' => 'letter'), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'), ); register_post_type('letter', $args); } add_action('init', 'create_letter_post_type'); function add_letter_meta_boxes() { add_meta_box( 'article_authors', __('Authors', 'duck-behavior-journal'), 'render_article_authors_meta_box', array('letter'), 'side', 'default' ); } add_action('add_meta_boxes', 'add_letter_meta_boxes'); function disable_comments_post_types_support() { $post_types = get_post_types(); foreach ($post_types as $post_type) { if (post_type_supports($post_type, 'comments')) { remove_post_type_support($post_type, 'comments'); remove_post_type_support($post_type, 'trackbacks'); } } } add_action('admin_init', 'disable_comments_post_types_support'); function disable_comments_status() { return false; } add_filter('comments_open', 'disable_comments_status', 20, 2); add_filter('pings_open', 'disable_comments_status', 20, 2); function disable_comments_hide_existing_comments($comments) { $comments = array(); return $comments; } add_filter('comments_array', 'disable_comments_hide_existing_comments', 10, 2); function disable_comments_admin_menu() { remove_menu_page('edit-comments.php'); } add_action('admin_menu', 'disable_comments_admin_menu'); function disable_comments_admin_menu_redirect() { global $pagenow; if ($pagenow === 'edit-comments.php') { wp_redirect(admin_url()); exit; } } add_action('admin_init', 'disable_comments_admin_menu_redirect'); function disable_comments_dashboard() { remove_meta_box('dashboard_recent_comments', 'dashboard', 'normal'); } add_action('admin_init', 'disable_comments_dashboard'); function disable_comments_admin_bar() { if (is_admin_bar_showing()) { remove_action('admin_bar_menu', 'wp_admin_bar_comments_menu', 60); } } add_action('init', 'disable_comments_admin_bar'); function rename_excerpt_to_abstract($translated) { $translated = str_ireplace('Excerpt', 'Abstract', $translated); return $translated; } add_filter('gettext', 'rename_excerpt_to_abstract'); function add_custom_download_endpoint() { add_rewrite_rule('^download/([0-9]+)/?', 'index.php?download_file=$matches[1]', 'top'); } add_action('init', 'add_custom_download_endpoint'); function add_download_query_var($vars) { $vars[] = 'download_file'; return $vars; } add_filter('query_vars', 'add_download_query_var'); function handle_file_download() { $file_id = get_query_var('download_file'); if ($file_id && is_numeric($file_id)) { if (!is_user_logged_in()) { wp_redirect(wp_login_url()); exit; } $file_path = get_attached_file($file_id); if (file_exists($file_path)) { $file_url = wp_get_attachment_url($file_id); $file_info = pathinfo($file_url); $file_name = $file_info['basename']; header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file_name)); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file_path)); readfile($file_path); exit; } } } add_action('template_redirect', 'handle_file_download'); function custom_login_logo() { $custom_logo_id = get_theme_mod('custom_logo'); $logo_url = wp_get_attachment_image_url($custom_logo_id, 'full'); ?>

'; _e('Composer autoloader is missing. Please run "composer install" to install the required dependencies.', 'duck-behavior-journal'); echo '

'; } elseif (!is_tcpdf_available()) { echo '

'; _e('TCPDF library is missing. Please install it via Composer to enable the PDF download feature.', 'duck-behavior-journal'); echo '

'; } } add_action('admin_notices', 'tcpdf_missing_notice'); // Add custom endpoint for PDF download function add_pdf_download_endpoint() { add_rewrite_rule('^download-pdf/([0-9]+)/?', 'index.php?download_pdf=$matches[1]', 'top'); } add_action('init', 'add_pdf_download_endpoint'); // Add query vars for PDF download function add_pdf_query_vars($vars) { $vars[] = 'download_pdf'; return $vars; } add_filter('query_vars', 'add_pdf_query_vars'); // Handle PDF download function handle_pdf_download() { if (is_autoloader_available()) { require_once get_template_directory() . '/vendor/autoload.php'; } if (is_tcpdf_available()) { require_once get_template_directory() . '/PaperPDF.php'; $post_id = get_query_var('download_pdf'); if ($post_id && is_numeric($post_id)) { $post = get_post($post_id); if ($post && $post->post_type == 'article') { // Create new PDF document $pdf = new PaperPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // Set document information $pdf->SetCreator(PDF_CREATOR); $pdf->SetAuthor(get_bloginfo('name')); $pdf->SetTitle($post->post_title); $pdf->SetSubject('Scientific Paper'); $pdf->SetMargins(PDF_MARGIN_LEFT, 50, PDF_MARGIN_RIGHT); // Add a page $pdf->AddPage(); // Set title $pdf->SetFont('helvetica', 'B', 20); $pdf->writeHTML('

' . $post->post_title . '

', true, false, false, false, 'C'); // Set authors $pdf->SetFont('helvetica', '', 12); $authors = get_post_meta($post_id, 'article_authors', true); if (!empty($authors)) { $pdf->Cell(0, 10, implode(', ', array_map('esc_html', $authors)), 0, 1, 'C'); } // Set abstract $pdf->Ln(10); $pdf->SetFont('helvetica', '', 12); $pdf->setTextColor(128); $pdf->writeHTML("Abstract: " . $post->post_excerpt); // Set content $pdf->setTextColor(0); $pdf->Ln(10); $pdf->SetFont('helvetica', '', 12); $content = apply_filters('the_content', $post->post_content); $mathjax_css = file_get_contents(get_template_directory() . '/assets/dist/css/mathjax.css'); $content = "$content"; $pdf->writeHTML($content); // Output PDF document $pdf->Output(sanitize_title($post->post_title) . '.pdf', 'D'); exit; } } } } add_action('template_redirect', 'handle_pdf_download'); function allow_more_uploads($mime_types) { $mime_types['py'] = 'text/x-python'; return $mime_types; } add_filter('upload_mimes', 'allow_more_uploads'); function disable_real_mime_check($data, $file, $filename, $mimes) { $wp_filetype = wp_check_filetype($filename, $mimes); $ext = $wp_filetype['ext']; $type = $wp_filetype['type']; $proper_filename = $data['proper_filename']; return compact('ext', 'type', 'proper_filename'); } add_filter('wp_check_filetype_and_ext', 'disable_real_mime_check', 10, 4); function custom_articles_per_page($query) { if (!is_admin() && $query->is_main_query()) { if (is_post_type_archive('article')) { $query->set('posts_per_page', 9); } } } add_action('pre_get_posts', 'custom_articles_per_page'); function mathjax_customizer_settings($wp_customize) { // Add a section for MathJax settings $wp_customize->add_section('mathjax_settings', [ 'title' => __('MathJax Settings', 'duck-behavior-journal'), 'priority' => 30, 'description' => __('Specify the URL of your MathJax-node server application. The required server application can be found at https://git.private.coffee/privatecoffee/mathjax-server.', 'duck-behavior-journal'), ]); // Add a setting for the MathJax-node server URL $wp_customize->add_setting('mathjax_server_url', [ 'default' => '', 'sanitize_callback' => 'esc_url_raw', ]); // Add a control for the MathJax-node server URL $wp_customize->add_control('mathjax_server_url', [ 'label' => __('MathJax-node Server URL', 'duck-behavior-journal'), 'section' => 'mathjax_settings', 'type' => 'url', ]); } add_action('customize_register', 'mathjax_customizer_settings'); function renderMathJax($latex) { $url = get_theme_mod('mathjax_server_url', ''); if (empty($url)) { return '' . htmlspecialchars($latex) . ''; } $data = json_encode(['tex' => $latex]); $options = [ 'http' => [ 'header' => "Content-Type: application/json\r\n" . "Content-Length: " . strlen($data) . "\r\n", 'method' => 'POST', 'content' => $data, ], ]; $context = stream_context_create($options); $result = file_get_contents($url, false, $context); if ($result === FALSE) { return 'Error rendering LaTeX'; } $response = json_decode($result, true); if (isset($response['error'])) { return 'Error rendering LaTeX: ' . implode(', ', $response['error']) . ''; } return $response['html']; } function convertMathJaxInHTML($html) { $url = get_theme_mod('mathjax_server_url', ''); if (empty($url)) { return $html; // If the URL is not specified, return the original HTML } // Use a regular expression to find LaTeX expressions within the HTML $pattern = '/\$\$(.*?)\$\$/'; $callback = function ($matches) { $latex = $matches[1]; try { // Render the LaTeX to HTML using the MathJax-node server $rendered = renderMathJax($latex); return $rendered; } catch (Exception $e) { // Handle rendering errors return '' . htmlspecialchars($latex) . ''; } }; // Replace all LaTeX expressions in the HTML with rendered HTML $convertedHtml = preg_replace_callback($pattern, $callback, $html); return $convertedHtml; } function preprocess_mathjax_content($content) { return convertMathJaxInHTML($content); } add_filter('the_content', 'preprocess_mathjax_content');