2024-06-20 07:22:10 +00:00
< ? php
function duck_behavior_journal_setup ()
{
add_theme_support ( 'post-thumbnails' );
add_theme_support ( 'title-tag' );
register_nav_menus ( array (
'primary' => __ ( '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 ,
));
2024-06-20 09:37:41 +00:00
add_theme_support ( 'pagination' );
2024-06-20 07:22:10 +00:00
}
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' );
2024-08-03 14:23:00 +00:00
wp_enqueue_style ( 'mathjax-css' , get_template_directory_uri () . '/assets/dist/css/mathjax.css' );
2024-06-20 07:22:10 +00:00
wp_enqueue_style ( 'theme-style' , get_stylesheet_uri ());
2024-08-03 11:14:21 +00:00
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 );
2024-06-20 07:22:10 +00:00
}
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 (
2024-06-20 11:01:39 +00:00
'default' => get_template_directory_uri () . '/assets/img/hero.png' ,
2024-06-20 07:22:10 +00:00
'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' ,
));
}
2024-06-20 13:48:14 +00:00
// 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' ,
));
2024-06-20 07:22:10 +00:00
}
add_action ( 'customize_register' , 'duck_behavior_journal_customizer' );
2024-06-20 08:52:49 +00:00
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' );
2024-06-20 09:28:29 +00:00
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 );
2024-08-03 15:03:29 +00:00
// 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 );
?>
< tr class = " form-field " >
< th scope = " row " valign = " top " >
< label for = " publication_status_color " >< ? php _e ( 'Color' , 'duck-behavior-journal' ); ?> </label>
</ th >
< td >
< input type = " text " name = " publication_status_color " id = " publication_status_color " value = " <?php echo esc_attr( $color ) ? esc_attr( $color ) : '#ffffff'; ?> " class = " color-field " />
< p class = " description " >< ? php _e ( 'Choose a color for this publication status.' , 'duck-behavior-journal' ); ?> </p>
</ td >
</ tr >
< ? php
}
add_action ( 'publication_status_edit_form_fields' , 'add_publication_status_color_field' , 10 , 2 );
// Add color picker to add new term screen
function add_publication_status_color_field_new ( $term )
{
?>
< div class = " form-field " >
< label for = " publication_status_color " >< ? php _e ( 'Color' , 'duck-behavior-journal' ); ?> </label>
< input type = " text " name = " publication_status_color " id = " publication_status_color " value = " #ffffff " class = " color-field " />
< p class = " description " >< ? php _e ( 'Choose a color for this publication status.' , 'duck-behavior-journal' ); ?> </p>
</ div >
< ? php
}
add_action ( 'publication_status_add_form_fields' , 'add_publication_status_color_field_new' , 10 , 2 );
// Save the color meta data
function save_publication_status_color_meta ( $term_id )
{
if ( isset ( $_POST [ 'publication_status_color' ]) && ! empty ( $_POST [ 'publication_status_color' ])) {
update_term_meta ( $term_id , 'publication_status_color' , sanitize_hex_color ( $_POST [ 'publication_status_color' ]));
} else {
delete_term_meta ( $term_id , 'publication_status_color' );
}
}
add_action ( 'edited_publication_status' , 'save_publication_status_color_meta' , 10 , 2 );
add_action ( 'create_publication_status' , 'save_publication_status_color_meta' , 10 , 2 );
// Enqueue the color picker script
function enqueue_color_picker ( $hook_suffix )
{
// Load only on the term edit page
if ( strpos ( $hook_suffix , 'edit-tags.php' ) === false ) {
return ;
}
wp_enqueue_style ( 'wp-color-picker' );
wp_enqueue_script ( 'custom-color-picker' , get_template_directory_uri () . '/assets/js/custom-color-picker.js' , array ( 'wp-color-picker' ), false , true );
}
add_action ( 'admin_enqueue_scripts' , 'enqueue_color_picker' );
2024-06-20 08:52:49 +00:00
function add_article_meta_boxes ()
{
add_meta_box (
'article_authors' ,
__ ( 'Article Authors' , 'duck-behavior-journal' ),
'render_article_authors_meta_box' ,
'article' ,
'side' ,
'default'
);
2024-06-20 12:44:20 +00:00
add_meta_box (
'article_doi' ,
__ ( 'Article DOI' , 'duck-behavior-journal' ),
'render_article_doi_meta_box' ,
'article' ,
'side' ,
'default'
);
2024-06-22 07:18:59 +00:00
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'
);
2024-06-20 08:52:49 +00:00
}
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 );
?>
< div id = " article-authors " >
< div id = " article-authors-list " >
< ? php
if ( ! empty ( $authors )) {
2024-06-20 09:10:31 +00:00
foreach ( $authors as $index => $author ) {
2024-06-20 08:52:49 +00:00
?>
2024-06-20 09:10:31 +00:00
< p >
< input type = " text " name = " article_authors[] " value = " <?php echo esc_attr( $author ); ?> " />
< button type = " button " class = " button remove-author-button " data - index = " <?php echo $index ; ?> " >< ? php _e ( 'Remove' , 'duck-behavior-journal' ); ?> </button>
</ p >
2024-06-20 08:52:49 +00:00
< ? php
}
} else {
?>
< p >< input type = " text " name = " article_authors[] " value = " " /></ p >
< ? php
}
?>
</ div >
< button type = " button " id = " add-author-button " class = " button " >< ? php _e ( 'Add Author' , 'duck-behavior-journal' ); ?> </button>
</ div >
< script >
jQuery ( document ) . ready ( function ( $ ) {
$ ( '#add-author-button' ) . on ( 'click' , function () {
2024-06-20 09:10:31 +00:00
$ ( '#article-authors-list' ) . append ( '<p><input type="text" name="article_authors[]" value="" /><button type="button" class="button remove-author-button"><?php _e(' Remove ', ' duck - behavior - journal '); ?></button></p>' );
});
$ ( document ) . on ( 'click' , '.remove-author-button' , function () {
$ ( this ) . parent () . remove ();
2024-06-20 08:52:49 +00:00
});
});
</ script >
< ? php
}
2024-06-20 12:44:20 +00:00
function render_article_doi_meta_box ( $post )
{
$doi = get_post_meta ( $post -> ID , 'article_doi' , true );
2024-06-20 13:48:14 +00:00
$doi_prefix = get_theme_mod ( 'doi_prefix' , '22.2222/DBJ/' );
2024-06-20 12:44:20 +00:00
?>
< div id = " article-doi " >
< p >
2024-06-20 13:48:14 +00:00
< input type = " text " name = " article_doi " value = " <?php echo esc_attr( $doi ); ?> " />
2024-06-20 12:44:20 +00:00
< button type = " button " id = " generate-doi-button " class = " button " >< ? php _e ( 'Generate DOI' , 'duck-behavior-journal' ); ?> </button>
</ p >
</ div >
< script >
function generateRandomDOI ( prefix ) {
const randomString = Math . random () . toString ( 36 ) . substring ( 2 , 10 );
return prefix + randomString ;
}
jQuery ( document ) . ready ( function ( $ ) {
$ ( '#generate-doi-button' ) . on ( 'click' , function () {
2024-06-20 13:48:14 +00:00
const doiPrefix = '<?php echo esc_js($doi_prefix); ?>' ;
const doi = generateRandomDOI ( doiPrefix );
2024-06-20 12:44:20 +00:00
$ ( 'input[name="article_doi"]' ) . val ( doi );
});
});
</ script >
< ? php
}
2024-06-22 07:18:59 +00:00
function render_article_attachment_meta_box ( $post )
{
$attachment_id = get_post_meta ( $post -> ID , 'article_attachment_id' , true );
$attachment_url = $attachment_id ? wp_get_attachment_url ( $attachment_id ) : '' ;
?>
< div id = " article-attachment " >
< p >
< input type = " hidden " name = " article_attachment_id " id = " article_attachment_id " value = " <?php echo esc_attr( $attachment_id ); ?> " />
< input type = " url " name = " article_attachment_url " id = " article_attachment_url " value = " <?php echo esc_url( $attachment_url ); ?> " readonly />
< button type = " button " id = " upload-attachment-button " class = " button " >< ? php _e ( 'Upload Attachment' , 'duck-behavior-journal' ); ?> </button>
< button type = " button " id = " remove-attachment-button " class = " button " < ? php echo $attachment_id ? '' : 'style="display:none;"' ; ?> ><?php _e('Remove Attachment', 'duck-behavior-journal'); ?></button>
</ p >
</ div >
< script >
jQuery ( document ) . ready ( function ( $ ) {
var file_frame ;
$ ( '#upload-attachment-button' ) . on ( 'click' , function ( event ) {
event . preventDefault ();
if ( file_frame ) {
file_frame . open ();
return ;
}
file_frame = wp . media . frames . file_frame = wp . media ({
title : '<?php _e(' Select Attachment ', ' duck - behavior - journal '); ?>' ,
button : {
text : '<?php _e(' Use this file ', ' duck - behavior - journal '); ?>' ,
},
multiple : false
});
file_frame . on ( 'select' , function () {
var attachment = file_frame . state () . get ( 'selection' ) . first () . toJSON ();
$ ( '#article_attachment_id' ) . val ( attachment . id );
$ ( '#article_attachment_url' ) . val ( attachment . url );
$ ( '#remove-attachment-button' ) . show ();
});
file_frame . open ();
});
$ ( '#remove-attachment-button' ) . on ( 'click' , function ( event ) {
event . preventDefault ();
$ ( '#article_attachment_id' ) . val ( '' );
$ ( '#article_attachment_url' ) . val ( '' );
$ ( this ) . hide ();
});
});
</ script >
< ? php
}
function render_article_open_access_meta_box ( $post )
{
$open_access = get_post_meta ( $post -> ID , 'article_open_access' , true );
?>
< div id = " article-open-access " >
< p >
< label for = " article_open_access " >
< input type = " checkbox " name = " article_open_access " id = " article_open_access " value = " 1 " < ? php checked ( $open_access , '1' ); ?> />
< ? php _e ( 'This article is Open Access' , 'duck-behavior-journal' ); ?>
</ label >
</ p >
</ div >
< ? php
}
2024-06-20 12:47:10 +00:00
function save_article_meta_boxes ( $post_id )
2024-06-20 08:52:49 +00:00
{
if ( defined ( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return ;
if ( ! isset ( $_POST [ 'article_authors' ])) return ;
$authors = array_map ( 'sanitize_text_field' , $_POST [ 'article_authors' ]);
update_post_meta ( $post_id , 'article_authors' , $authors );
2024-06-20 12:47:10 +00:00
if ( isset ( $_POST [ 'article_doi' ])) {
$doi = sanitize_text_field ( $_POST [ 'article_doi' ]);
update_post_meta ( $post_id , 'article_doi' , $doi );
}
2024-06-22 07:18:59 +00:00
if ( isset ( $_POST [ 'article_attachment_id' ])) {
$attachment_id = sanitize_text_field ( $_POST [ 'article_attachment_id' ]);
update_post_meta ( $post_id , 'article_attachment_id' , $attachment_id );
}
$open_access = isset ( $_POST [ 'article_open_access' ]) ? '1' : '0' ;
update_post_meta ( $post_id , 'article_open_access' , $open_access );
2024-06-20 08:52:49 +00:00
}
2024-06-20 12:44:20 +00:00
2024-06-20 12:47:10 +00:00
add_action ( 'save_post' , 'save_article_meta_boxes' );
2024-06-20 12:44:20 +00:00
function add_doi_rewrite_rule ()
{
2024-06-20 13:55:36 +00:00
add_rewrite_rule ( '^([0-9]{2})\.([0-9]{4,})/([a-zA-Z0-9_\-\/]+)?$' , 'index.php?doi=$matches[1].$matches[2]/$matches[3]' , 'top' );
2024-06-20 12:44:20 +00:00
}
add_action ( 'init' , 'add_doi_rewrite_rule' );
function add_doi_query_var ( $vars )
{
$vars [] = 'doi' ;
return $vars ;
}
add_filter ( 'query_vars' , 'add_doi_query_var' );
function redirect_doi_to_article ( $query )
{
if ( isset ( $query -> 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' );
2024-06-20 18:53:04 +00:00
2024-06-22 07:18:59 +00:00
function create_letter_post_type ()
{
2024-06-20 18:53:04 +00:00
$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 );
}
2024-06-20 18:59:45 +00:00
2024-06-20 18:53:04 +00:00
add_action ( 'init' , 'create_letter_post_type' );
2024-06-22 07:18:59 +00:00
function add_letter_meta_boxes ()
{
2024-06-20 18:53:04 +00:00
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' );
2024-06-21 19:29:12 +00:00
2024-06-22 07:18:59 +00:00
function disable_comments_post_types_support ()
{
2024-06-21 19:29:12 +00:00
$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' );
2024-06-22 07:18:59 +00:00
function disable_comments_status ()
{
2024-06-21 19:29:12 +00:00
return false ;
}
add_filter ( 'comments_open' , 'disable_comments_status' , 20 , 2 );
add_filter ( 'pings_open' , 'disable_comments_status' , 20 , 2 );
2024-06-22 07:18:59 +00:00
function disable_comments_hide_existing_comments ( $comments )
{
2024-06-21 19:29:12 +00:00
$comments = array ();
return $comments ;
}
add_filter ( 'comments_array' , 'disable_comments_hide_existing_comments' , 10 , 2 );
2024-06-22 07:18:59 +00:00
function disable_comments_admin_menu ()
{
2024-06-21 19:29:12 +00:00
remove_menu_page ( 'edit-comments.php' );
}
add_action ( 'admin_menu' , 'disable_comments_admin_menu' );
2024-06-22 07:18:59 +00:00
function disable_comments_admin_menu_redirect ()
{
2024-06-21 19:29:12 +00:00
global $pagenow ;
if ( $pagenow === 'edit-comments.php' ) {
wp_redirect ( admin_url ());
exit ;
}
}
add_action ( 'admin_init' , 'disable_comments_admin_menu_redirect' );
2024-06-22 07:18:59 +00:00
function disable_comments_dashboard ()
{
2024-06-21 19:29:12 +00:00
remove_meta_box ( 'dashboard_recent_comments' , 'dashboard' , 'normal' );
}
add_action ( 'admin_init' , 'disable_comments_dashboard' );
2024-06-22 07:18:59 +00:00
function disable_comments_admin_bar ()
{
2024-06-21 19:29:12 +00:00
if ( is_admin_bar_showing ()) {
remove_action ( 'admin_bar_menu' , 'wp_admin_bar_comments_menu' , 60 );
}
}
2024-06-22 07:18:59 +00:00
add_action ( 'init' , 'disable_comments_admin_bar' );
function rename_excerpt_to_abstract ( $translated )
{
$translated = str_ireplace ( 'Excerpt' , 'Abstract' , $translated );
return $translated ;
}
2024-06-22 07:46:51 +00:00
2024-06-22 07:18:59 +00:00
add_filter ( 'gettext' , 'rename_excerpt_to_abstract' );
2024-06-22 07:46:51 +00:00
2024-06-22 07:53:44 +00:00
function add_custom_download_endpoint ()
{
2024-06-22 07:46:51 +00:00
add_rewrite_rule ( '^download/([0-9]+)/?' , 'index.php?download_file=$matches[1]' , 'top' );
}
add_action ( 'init' , 'add_custom_download_endpoint' );
2024-06-22 07:53:44 +00:00
function add_download_query_var ( $vars )
{
2024-06-22 07:46:51 +00:00
$vars [] = 'download_file' ;
return $vars ;
}
add_filter ( 'query_vars' , 'add_download_query_var' );
2024-06-22 07:53:44 +00:00
function handle_file_download ()
{
2024-06-22 07:46:51 +00:00
$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' );
2024-06-22 07:53:44 +00:00
function custom_login_logo ()
{
$custom_logo_id = get_theme_mod ( 'custom_logo' );
$logo_url = wp_get_attachment_image_url ( $custom_logo_id , 'full' );
?>
< style type = " text/css " >
#login h1 a,
. login h1 a {
background - image : url ( < ? php echo esc_url ( $logo_url ); ?> );
height : 65 px ;
width : auto ;
background - size : contain ;
background - repeat : no - repeat ;
padding - bottom : 30 px ;
}
</ style >
< ? php
}
add_action ( 'login_enqueue_scripts' , 'custom_login_logo' );
function custom_login_logo_url ()
{
return home_url ();
}
add_filter ( 'login_headerurl' , 'custom_login_logo_url' );
function custom_login_logo_url_title ()
{
return get_bloginfo ( 'name' );
}
add_filter ( 'login_headertext' , 'custom_login_logo_url_title' );
2024-08-02 19:48:07 +00:00
// Check if TCPDF is available
function is_tcpdf_available ()
{
2024-08-02 19:56:10 +00:00
if ( is_autoloader_available ()) {
require_once get_template_directory () . '/vendor/autoload.php' ;
}
2024-08-02 19:48:07 +00:00
return class_exists ( 'TCPDF' );
}
// Check if the Composer autoloader is available
function is_autoloader_available ()
{
return file_exists ( get_template_directory () . '/vendor/autoload.php' );
}
// Display admin notice if TCPDF or autoloader is missing
function tcpdf_missing_notice ()
{
if ( ! is_autoloader_available ()) {
echo '<div class="notice notice-error"><p>' ;
_e ( 'Composer autoloader is missing. Please run "composer install" to install the required dependencies.' , 'duck-behavior-journal' );
echo '</p></div>' ;
} elseif ( ! is_tcpdf_available ()) {
echo '<div class="notice notice-error"><p>' ;
_e ( 'TCPDF library is missing. Please install it via Composer to enable the PDF download feature.' , 'duck-behavior-journal' );
echo '</p></div>' ;
}
}
2024-08-03 11:03:50 +00:00
2024-08-02 19:48:07 +00:00
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' );
}
2024-08-03 11:03:50 +00:00
2024-08-02 19:48:07 +00:00
add_action ( 'init' , 'add_pdf_download_endpoint' );
// Add query vars for PDF download
function add_pdf_query_vars ( $vars )
{
$vars [] = 'download_pdf' ;
return $vars ;
}
2024-08-03 11:03:50 +00:00
2024-08-02 19:48:07 +00:00
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 ()) {
2024-08-02 20:05:49 +00:00
require_once get_template_directory () . '/PaperPDF.php' ;
2024-08-02 19:48:07 +00:00
$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
2024-08-02 20:05:49 +00:00
$pdf = new PaperPDF ( PDF_PAGE_ORIENTATION , PDF_UNIT , PDF_PAGE_FORMAT , true , 'UTF-8' , false );
2024-08-02 19:48:07 +00:00
// Set document information
$pdf -> SetCreator ( PDF_CREATOR );
$pdf -> SetAuthor ( get_bloginfo ( 'name' ));
$pdf -> SetTitle ( $post -> post_title );
$pdf -> SetSubject ( 'Scientific Paper' );
2024-08-02 20:18:58 +00:00
$pdf -> SetMargins ( PDF_MARGIN_LEFT , 50 , PDF_MARGIN_RIGHT );
2024-08-02 19:48:07 +00:00
// Add a page
$pdf -> AddPage ();
// Set title
$pdf -> SetFont ( 'helvetica' , 'B' , 20 );
2024-08-02 20:18:58 +00:00
$pdf -> writeHTML ( '<h1>' . $post -> post_title . '</h1>' , true , false , false , false , 'C' );
2024-08-02 19:48:07 +00:00
// 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 );
2024-08-02 20:03:20 +00:00
$pdf -> setTextColor ( 128 );
$pdf -> writeHTML ( " <b>Abstract:</b> " . $post -> post_excerpt );
2024-08-02 19:48:07 +00:00
// Set content
2024-08-02 20:03:20 +00:00
$pdf -> setTextColor ( 0 );
2024-08-02 19:48:07 +00:00
$pdf -> Ln ( 10 );
$pdf -> SetFont ( 'helvetica' , '' , 12 );
2024-08-03 14:49:51 +00:00
2024-08-03 13:37:35 +00:00
$content = apply_filters ( 'the_content' , $post -> post_content );
2024-08-03 14:49:51 +00:00
$mathjax_css = file_get_contents ( get_template_directory () . '/assets/dist/css/mathjax.css' );
$content = " <style> $mathjax_css </style> $content " ;
2024-08-03 13:37:52 +00:00
$pdf -> writeHTML ( $content );
2024-08-02 19:48:07 +00:00
// Output PDF document
$pdf -> Output ( sanitize_title ( $post -> post_title ) . '.pdf' , 'D' );
exit ;
}
}
}
}
2024-08-03 11:03:50 +00:00
2024-08-02 19:48:07 +00:00
add_action ( 'template_redirect' , 'handle_pdf_download' );
2024-08-02 20:45:55 +00:00
2024-08-03 11:03:50 +00:00
function allow_more_uploads ( $mime_types )
{
2024-08-02 20:45:55 +00:00
$mime_types [ 'py' ] = 'text/x-python' ;
return $mime_types ;
}
2024-08-03 11:03:50 +00:00
2024-08-02 20:50:26 +00:00
add_filter ( 'upload_mimes' , 'allow_more_uploads' );
2024-08-03 11:03:50 +00:00
function disable_real_mime_check ( $data , $file , $filename , $mimes )
{
2024-08-02 20:50:26 +00:00
$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' );
}
2024-08-03 11:03:50 +00:00
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' );
2024-08-03 12:34:53 +00:00
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 <a href="https://git.private.coffee/privatecoffee/mathjax-server" target="_blank">https://git.private.coffee/privatecoffee/mathjax-server</a>.' , '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 '<span class="error">' . htmlspecialchars ( $latex ) . '</span>' ;
}
$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 '<span class="error">Error rendering LaTeX</span>' ;
}
$response = json_decode ( $result , true );
if ( isset ( $response [ 'error' ])) {
return '<span class="error">Error rendering LaTeX: ' . implode ( ', ' , $response [ 'error' ]) . '</span>' ;
}
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
2024-08-03 13:14:43 +00:00
$pattern = '/\$\$(.*?)\$\$/' ;
2024-08-03 12:34:53 +00:00
$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 '<span class="error">' . htmlspecialchars ( $latex ) . '</span>' ;
}
};
// 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' );