Profile()
Description #
User profile hooks.
Source #
File: addons/profile/profile.php
class Profile extends \AnsPress\Singleton { /** * Instance of this class. * * @var object * @since 4.1.8 */ protected static $instance = null; /** * Initialize the plugin by setting localization and loading public scripts * and styles. * * @since 4.0.0 */ protected function __construct() { ap_add_default_options( array( 'user_page_slug_questions' => 'questions', 'user_page_slug_answers' => 'answers', 'user_page_title_questions' => __( 'Questions', 'anspress-question-answer' ), 'user_page_title_answers' => __( 'Answers', 'anspress-question-answer' ), ) ); anspress()->add_filter( 'ap_settings_menu_features_groups', $this, 'add_to_settings_page' ); anspress()->add_action( 'ap_form_options_features_profile', $this, 'options' ); ap_register_page( 'user', __( 'User profile', 'anspress-question-answer' ), array( $this, 'user_page' ), true, true ); anspress()->add_action( 'ap_rewrites', $this, 'rewrite_rules', 10, 3 ); anspress()->add_action( 'ap_ajax_user_more_answers', $this, 'load_more_answers', 10, 2 ); anspress()->add_filter( 'wp_title', $this, 'page_title' ); anspress()->add_action( 'the_post', $this, 'filter_page_title' ); anspress()->add_filter( 'ap_breadcrumbs', $this, 'ap_breadcrumbs' ); anspress()->add_filter( 'ap_current_page', $this, 'ap_current_page' ); anspress()->add_filter( 'posts_pre_query', $this, 'modify_query_archive', 999, 2 ); } /** * Add tags settings to features settings page. * * @param array $groups Features settings group. * @return array * @since 4.2.0 */ public function add_to_settings_page( $groups ) { $groups['profile'] = array( 'label' => __( 'Profile', 'anspress-question-answer' ), ); return $groups; } /** * Register profile options */ public function options() { $opt = ap_opt(); $form = array( 'fields' => array( 'user_page_title_questions' => array( 'label' => __( 'Questions page title', 'anspress-question-answer' ), 'desc' => __( 'Custom title for user profile questions page', 'anspress-question-answer' ), 'value' => $opt['user_page_title_questions'], ), 'user_page_slug_questions' => array( 'label' => __( 'Questions page slug', 'anspress-question-answer' ), 'desc' => __( 'Custom slug for user profile questions page', 'anspress-question-answer' ), 'value' => $opt['user_page_slug_questions'], ), 'user_page_title_answers' => array( 'label' => __( 'Answers page title', 'anspress-question-answer' ), 'desc' => __( 'Custom title for user profile answers page', 'anspress-question-answer' ), 'value' => $opt['user_page_title_answers'], ), 'user_page_slug_answers' => array( 'label' => __( 'Answers page slug', 'anspress-question-answer' ), 'desc' => __( 'Custom slug for user profile answers page', 'anspress-question-answer' ), 'value' => $opt['user_page_slug_answers'], ), ), ); return $form; } /** * Layout of base page */ public function user_page() { $this->user_pages(); dynamic_sidebar( 'ap-top' ); echo '<div id="ap-user" class="ap-row">'; include ap_get_theme_location( 'addons/user/index.php' ); echo '</div>'; } /** * Add category pages rewrite rule. * * @param array $rules AnsPress rules. * @param string $slug Slug. * @param integer $base_page_id Base page ID. * @return array */ public function rewrite_rules( $rules, $slug, $base_page_id ) { $base_slug = get_page_uri( ap_opt( 'user_page' ) ); update_option( 'ap_user_path', $base_slug, true ); $new_rules = array(); $new_rules = array( $base_slug . '/([^/]+)/([^/]+)/page/?([0-9]{1,})/?' => 'index.php?author_name=$matches[#]&ap_page=user&user_page=$matches[#]&ap_paged=$matches[#]', $base_slug . '/([^/]+)/([^/]+)/?' => 'index.php?author_name=$matches[#]&ap_page=user&user_page=$matches[#]', $base_slug . '/([^/]+)/?' => 'index.php?author_name=$matches[#]&ap_page=user', $base_slug . '/?' => 'index.php?ap_page=user', ); return $new_rules + $rules; } /** * Register user profile pages. */ public function user_pages() { if ( ! empty( anspress()->user_pages ) ) { return; } anspress()->user_pages = array( array( 'slug' => 'questions', 'label' => __( 'Questions', 'anspress-question-answer' ), 'icon' => 'apicon-question', 'cb' => array( $this, 'question_page' ), 'order' => 2, ), array( 'slug' => 'answers', 'label' => __( 'Answers', 'anspress-question-answer' ), 'icon' => 'apicon-answer', 'cb' => array( $this, 'answer_page' ), 'order' => 2, ), ); do_action( 'ap_user_pages' ); foreach ( (array) anspress()->user_pages as $key => $args ) { $rewrite = ap_opt( 'user_page_slug_' . $args['slug'] ); $title = ap_opt( 'user_page_title_' . $args['slug'] ); // If BuddyPress addon is active then, do not modify the slug since // template file loaded has the exact name with slug. if ( ap_is_addon_active( 'buddypress.php' ) ) { $rewrite = $args['slug']; } // Override user page slug. if ( empty( $args['rewrite'] ) ) { anspress()->user_pages[ $key ]['rewrite'] = ! empty( $rewrite ) ? sanitize_title( $rewrite ) : $args['slug']; } // Override user page title. if ( ! empty( $title ) ) { anspress()->user_pages[ $key ]['label'] = $title; } // Add default order. if ( ! isset( $args['order'] ) ) { anspress()->user_pages[ $key ]['order'] = 10; } } anspress()->user_pages = ap_sort_array_by_order( anspress()->user_pages ); } /** * Output user profile menu. * * @param int|false $user_id Id of user, default is current user. * @param string $class_name CSS class. */ public function user_menu( $user_id = false, $class_name = '' ) { $user_id = false !== $user_id ? $user_id : ap_current_user_id(); $user = get_user_by( 'id', $user_id ); $current_tab = get_query_var( 'user_page', ap_opt( 'user_page_slug_questions' ) ); $ap_menu = apply_filters( 'ap_user_menu_items', anspress()->user_pages, $user_id ); // If BuddyPress addon is active, set the profile menu active links as required // with the help of the 'pagename' query var. if ( ap_is_addon_active( 'buddypress.php' ) ) { $current_tab = 'qa' === get_query_var( 'pagename' ) ? 'questions' : get_query_var( 'pagename' ); } echo '<ul class="ap-tab-nav clearfix ' . esc_attr( $class_name ) . '">'; foreach ( (array) $ap_menu as $args ) { if ( empty( $args['private'] ) || ( true === $args['private'] && get_current_user_id() === $user_id ) ) { echo '<li class="ap-menu-' . esc_attr( $args['slug'] ) . ( $args['rewrite'] === $current_tab ? ' active' : '' ) . '">'; $url = isset( $args['url'] ) ? $args['url'] : ap_user_link( $user_id, $args['rewrite'] ); if ( ( ap_is_addon_active( 'buddypress.php' ) && function_exists( 'bp_core_get_userlink' ) ) && ( in_array( 'about', $args, true ) || in_array( 'edit-profile', $args, true ) ) ) { $slug = get_option( 'ap_user_path' ); $link = home_url( $slug ) . '/' . $user->user_nicename . '/'; $url = isset( $args['url'] ) ? $args['url'] : $link . $args['rewrite']; } echo '<a href="' . esc_url( $url ) . '">'; // Show icon. if ( ! empty( $args['icon'] ) ) { echo '<i class="' . esc_attr( $args['icon'] ) . '"></i>'; } echo esc_attr( $args['label'] ); // Show count. if ( ! empty( $args['count'] ) ) { echo '<span>' . esc_attr( number_format_i18n( $args['count'] ) ) . '</span>'; } echo '</a>'; echo '</li>'; } } echo '</ul>'; } /** * Profile page title. * * @return string */ public function user_page_title() { $this->user_pages(); $title = ap_user_display_name( ap_current_user_id() ); $current_tab = sanitize_title( get_query_var( 'user_page', ap_opt( 'user_page_slug_questions' ) ) ); $page = ap_search_array( anspress()->user_pages, 'rewrite', $current_tab ); if ( ! empty( $page ) ) { return $title . ' | ' . $page[0]['label']; } } /** * Add user page title. * * @param string $title AnsPress page title. * @return string */ public function page_title( $title ) { if ( 'user' === ap_current_page() ) { return $this->user_page_title() . ' | '; } return $title; } /** * Filter user page title. * * @param object $_post WP post object. * @return void */ public function filter_page_title( $_post ) { if ( 'user' === ap_current_page() && ap_opt( 'user_page' ) == $_post->ID && ! is_admin() ) { // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual $_post->post_title = $this->user_page_title(); } } /** * Hook into AnsPress breadcrums to show user profile page. * * @param array $navs Breadcrumbs navs. * @return array */ public function ap_breadcrumbs( $navs ) { if ( 'user' === ap_current_page() ) { $navs['page'] = array( 'title' => ap_user_display_name( ap_current_user_id() ), 'link' => ap_user_link( ap_current_user_id() ), 'order' => 8, ); $current = get_query_var( 'user_page', ap_opt( 'user_page_slug_questions' ) ); $current_page = ap_search_array( anspress()->user_pages, 'rewrite', $current ); if ( ! empty( $current_page ) ) { $navs['user'] = array( 'title' => $current_page[0]['label'], 'link' => ap_user_link( ap_current_user_id() ) . $current . '/', 'order' => 8, ); } } return $navs; } /** * Render sub page template. */ public function sub_page_template() { $current = get_query_var( 'user_page', ap_opt( 'user_page_slug_questions' ) ); $current_page = ap_search_array( anspress()->user_pages, 'rewrite', $current ); if ( ! empty( $current_page ) ) { $current_page = $current_page[0]; // Callback. if ( isset( $current_page['cb'] ) && is_array( $current_page['cb'] ) && method_exists( $current_page['cb'][0], $current_page['cb'][1] ) ) { call_user_func( $current_page['cb'] ); } elseif ( function_exists( $current_page['cb'] ) ) { call_user_func( $current_page['cb'] ); } else { esc_attr_e( 'Callback function not found for rendering this page', 'anspress-question-answer' ); } } } /** * Display user questions page. */ public function question_page() { $user_id = ap_current_user_id(); $args['ap_current_user_ignore'] = true; $args['author'] = $user_id; /** * Filter authors question list args * * @var array */ $args = apply_filters( 'ap_authors_questions_args', $args ); anspress()->questions = new \Question_Query( $args ); include ap_get_theme_location( 'addons/user/questions.php' ); } /** * Display user questions page. */ public function answer_page() { global $answers; $user_id = ap_current_user_id(); $args['ap_current_user_ignore'] = true; $args['ignore_selected_answer'] = true; $args['showposts'] = 10; $args['author'] = $user_id; /** * Filter authors question list args * * @var array */ $args = apply_filters( 'ap_user_answers_args', $args ); $answers = new \Answers_Query( $args ); anspress()->answers = $answers; ap_get_template_part( 'addons/user/answers' ); } /** * Ajax callback for loading more answers. * * @return void */ public function load_more_answers() { global $answers; $user_id = ap_sanitize_unslash( 'user_id', 'r' ); $paged = ap_sanitize_unslash( 'current', 'r', 1 ) + 1; $args['ap_current_user_ignore'] = true; $args['ignore_selected_answer'] = true; $args['showposts'] = 10; $args['author'] = (int) $user_id; if ( false !== $paged ) { $args['paged'] = $paged; } /** * Filter authors question list args * * @param array $args WP_Query arguments. */ $args = apply_filters( 'ap_user_answers_args', $args ); $answers = new \Answers_Query( $args ); anspress()->answers = $answers; ob_start(); if ( ap_have_answers() ) { /* Start the Loop */ while ( ap_have_answers() ) : ap_the_answer(); ap_get_template_part( 'addons/user/answer-item' ); endwhile; } $html = ob_get_clean(); // Pagination fix on Ajax load more event. $paged = $answers->max_num_pages > $paged ? $paged : 0; ap_ajax_json( array( 'success' => true, 'element' => '#ap-bp-answers', 'args' => array( 'ap_ajax_action' => 'user_more_answers', '__nonce' => wp_create_nonce( 'loadmore-answers' ), 'type' => 'answers', 'current' => $paged, 'user_id' => $user_id, ), 'html' => $html, ) ); } /** * Override current page of AnsPress. * * @param string $query_var Current page name. * @return string * @since 4.1.0 */ public function ap_current_page( $query_var ) { if ( is_author() && 'user' === get_query_var( 'ap_page' ) ) { $query_var = 'user'; } return $query_var; } /** * Modify main query. * * @param array $posts Array of post object. * @param object $query Wp_Query object. * @return void|array * @since 4.1.0 * @since 4.1.1 Redirect to current user profile if no author set. * @since 4.1.2 Check for 404 error. */ public function modify_query_archive( $posts, $query ) { if ( $query->is_main_query() && ! $query->is_404 && 'user' === get_query_var( 'ap_page' ) ) { $query_object = get_queried_object(); if ( ! $query_object && ! get_query_var( 'author_name' ) && is_user_logged_in() ) { wp_safe_redirect( ap_user_link( get_current_user_id() ) ); exit; } elseif ( $query_object && $query_object instanceof \WP_User ) { return array( get_post( ap_opt( 'user_page' ) ) ); } else { $query->set_404(); status_header( 404 ); } } return $posts; } /** * Override user page template. * * @param string $template Template file. * @return string * @since 4.1.0 */ public function page_template( $template ) { if ( is_author() && 'user' === get_query_var( 'ap_page' ) ) { $user_slug = ap_opt( 'user_page_id' ); return locate_template( array( 'page-' . $user_slug . '.php', 'page.php' ) ); } return $template; } /** * Get current user id for AnsPress profile. * * @return integer * @since 4.1.0 */ public function current_user_id() { $query_object = get_queried_object(); $user_id = get_queried_object_id(); // Current user id if queried object is not set. if ( ! $query_object instanceof \WP_User || empty( $user_id ) ) { $user_id = get_current_user_id(); } return (int) $user_id; } }
Expand full source code Collapse full source code View on GitHub: addons/profile/profile.php:32
Add your comment