AnsPress_Theme()
Description #
Holds all hooks related to frontend layout/theme
Source #
File: includes/class-theme.php
class AnsPress_Theme { /** * Function get called on init */ public static function init_actions() { // Register anspress shortcode. add_shortcode( 'anspress', array( AnsPress_BasePage_Shortcode::get_instance(), 'anspress_sc' ) ); // Register question shortcode. add_shortcode( 'question', array( AnsPress_Question_Shortcode::get_instance(), 'anspress_question_sc' ) ); } /** * The main filter used for theme compatibility and displaying custom AnsPress * theme files. * * @param string $template Current template file. * @return string Template file to use. * * @since 4.2.0 */ public static function template_include( $template = '' ) { return apply_filters( 'ap_template_include', $template ); } /** * Reset main query vars and filter 'the_content' to output a AnsPress * template part as needed. * * @param string $template Template name. * @return string * * @since 4.2.0 */ public static function template_include_theme_compat( $template = '' ) { if ( ap_current_page( 'question' ) ) { ob_start(); echo '<div class="anspress" id="anspress">'; AnsPress_Common_Pages::question_page(); echo '</div>'; $html = ob_get_clean(); ap_theme_compat_reset_post( array( 'ID' => get_question_id(), 'post_title' => get_the_title( get_question_id() ), 'post_author' => get_post_field( 'post_author', get_question_id() ), 'post_date' => get_post_field( 'post_date', get_question_id() ), 'post_content' => $html, 'post_type' => 'question', 'post_status' => get_post_status( get_question_id() ), 'is_single' => true, 'comment_status' => 'closed', ) ); } if ( true === anspress()->theme_compat->active ) { ap_remove_all_filters( 'the_content' ); } return $template; } /** * AnsPress theme function as like WordPress theme function. * * @return void */ public static function includes_theme() { require_once ap_get_theme_location( 'functions.php' ); } /** * Add answer-seleted class in post_class. * * @param array $classes Post class attribute. * @return array * @since 2.0.1 * @since 4.1.8 Fixes #426: Undefined property `post_type`. */ public static function question_answer_post_class( $classes ) { global $post; if ( ! $post ) { return $classes; } if ( 'question' === $post->post_type ) { if ( ap_have_answer_selected( $post->ID ) ) { $classes[] = 'answer-selected'; } if ( ap_is_featured_question( $post->ID ) ) { $classes[] = 'featured-question'; } $classes[] = 'answer-count-' . ap_get_answers_count(); } elseif ( 'answer' === $post->post_type ) { if ( ap_is_selected( $post->ID ) ) { $classes[] = 'best-answer'; } if ( ! ap_user_can_read_answer( $post ) ) { $classes[] = 'no-permission'; } } return $classes; } /** * Add anspress classes to body. * * @param array $classes Body class attribute. * @return array * @since 2.0.1 */ public static function body_class( $classes ) { // Add anspress class to body. if ( is_anspress() ) { $classes[] = 'anspress-content'; $classes[] = 'ap-page-' . ap_current_page(); } return $classes; } /** * Filter wp_title. * * @param string $title WP page title. * @return string * @since 4.1.1 Do not override title of all pages except single question. */ public static function ap_title( $title ) { if ( is_anspress() ) { remove_filter( 'wp_title', array( __CLASS__, 'ap_title' ) ); if ( is_question() ) { return ap_question_title_with_solved_prefix() . ' | '; } } return $title; } /** * Filter document_title_parts. * * @param array $title The document title parts. * @return array * @since 4.4.0 */ public static function ap_title_parts( $title ) { if ( is_anspress() ) { remove_filter( 'document_title_parts', array( __CLASS__, 'ap_title_parts' ) ); if ( is_question() ) { $title['title'] = ap_question_title_with_solved_prefix(); } } return $title; } /** * Add default before body sidebar in AnsPress contents */ public static function ap_before_html_body() { if ( is_user_logged_in() ) { $current_user = wp_get_current_user(); $data = array( 'user_login' => $current_user->data->user_login, 'display_name' => $current_user->data->display_name, 'user_email' => $current_user->data->user_email, 'avatar' => get_avatar( $current_user->ID ), ); ?> <script type="text/javascript"> apCurrentUser = <?php echo wp_json_encode( $data ); ?>; </script> <?php } dynamic_sidebar( 'ap-before' ); } /** * Add feed and links in HEAD of the document * * @since 4.1.0 Removed question sortlink override. */ public static function wp_head() { if ( ap_current_page( 'base' ) ) { $q_feed = get_post_type_archive_feed_link( 'question' ); $a_feed = get_post_type_archive_feed_link( 'answer' ); echo '<link rel="alternate" type="application/rss+xml" title="' . esc_attr__( 'Question Feed', 'anspress-question-answer' ) . '" href="' . esc_url( $q_feed ) . '" />'; echo '<link rel="alternate" type="application/rss+xml" title="' . esc_attr__( 'Answers Feed', 'anspress-question-answer' ) . '" href="' . esc_url( $a_feed ) . '" />'; } } /** * Ajax callback for post actions dropdown. * * @since 3.0.0 */ public static function post_actions() { $post_id = (int) ap_sanitize_unslash( 'post_id', 'r' ); if ( ! check_ajax_referer( 'post-actions-' . $post_id, 'nonce', false ) || ! is_user_logged_in() ) { ap_ajax_json( 'something_wrong' ); } ap_ajax_json( array( 'success' => true, 'actions' => ap_post_actions( $post_id ), ) ); } /** * Shows lists of attachments of a question */ public static function question_attachments() { if ( ap_have_attach() ) { include ap_get_theme_location( 'attachments.php' ); } } /** * Check if anspress.php file exists in theme. If exists * then load this template for AnsPress. * * @param string $template Template. * @return string * @since 3.0.0 * @since 4.1.0 Give priority to page templates and then anspress.php and lastly fallback to page.php. * @since 4.1.1 Load single question template if exists. */ public static function anspress_basepage_template( $template ) { if ( is_anspress() ) { $templates = array( 'anspress.php', 'page.php', 'singular.php', 'index.php' ); if ( function_exists( 'wp_is_block_theme' ) && wp_is_block_theme() ) { $templates = array(); } if ( is_page() ) { $_post = get_queried_object(); array_unshift( $templates, 'page-' . $_post->ID . '.php' ); array_unshift( $templates, 'page-' . $_post->post_name . '.php' ); $page_template = get_post_meta( $_post->ID, '_wp_page_template', true ); if ( ! empty( $page_template ) && 'default' !== $page_template ) { array_unshift( $templates, $page_template ); } } elseif ( is_single() ) { $_post = get_queried_object(); array_unshift( $templates, 'single-' . $_post->ID . '.php' ); array_unshift( $templates, 'single-' . $_post->post_name . '.php' ); array_unshift( $templates, 'single-' . $_post->post_type . '.php' ); } elseif ( is_tax() ) { $_term = get_queried_object(); $term_type = str_replace( 'question_', '', $_term->taxonomy ); array_unshift( $templates, 'anspress-' . $term_type . '.php' ); } $new_template = locate_template( $templates ); if ( '' !== $new_template ) { return $new_template; } } return $template; } /** * Generate question excerpt if there is not any already. * * @param string $excerpt Default excerpt. * @param object|null $post WP_Post object. * @return string * @since 4.1.0 */ public static function get_the_excerpt( $excerpt, $post = null ) { $post = get_post( $post ); if ( 'question' === $post->post_type ) { if ( get_query_var( 'answer_id' ) ) { $post = ap_get_post( get_query_var( 'answer_id' ) ); } // Check if excerpt exists. if ( ! empty( $post->post_excerpt ) ) { return $post->post_excerpt; } $excerpt_length = apply_filters( 'excerpt_length', 55 ); $excerpt_more = apply_filters( 'excerpt_more', ' […]' ); return wp_trim_words( $post->post_content, $excerpt_length, $excerpt_more ); } return $excerpt; } /** * Remove hentry class from question, answers and main pages . * * @param array $post_classes Post classes. * @param array $class_name An array of additional classes added to the post. * @param integer $post_id Post ID. * @return array * @since 4.1.0 */ public static function remove_hentry_class( $post_classes, $class_name, $post_id ) { $_post = ap_get_post( $post_id ); if ( $_post && ( in_array( $_post->post_type, array( 'answer', 'question' ), true ) || in_array( $_post->ID, ap_main_pages_id() ) ) ) { // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict return array_diff( $post_classes, array( 'hentry' ) ); } return $post_classes; } /** * Callback for showing content below question and answer. * * @return void * @since 4.1.2 */ public static function after_question_content() { echo ap_post_status_badge(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $_post = ap_get_post(); $activity = ap_recent_activity( null, false ); if ( ! empty( $activity ) ) { echo '<div class="ap-post-updated"><i class="apicon-clock"></i>' . wp_kses_post( $activity ) . '</div>'; } } }
Expand full source code Collapse full source code View on GitHub: includes/class-theme.php:21
Add your comment