AnsPress_Admin()
Description #
This class should ideally be used to work with the administrative side of the WordPress site.
Source #
File: admin/anspress-admin.php
class AnsPress_Admin { /** * Instance of this class. * * @var object */ protected static $instance = null; /** * Slug of the plugin screen. * * @var string */ protected $plugin_screen_hook_suffix = null; /** * Initialize the plugin by loading admin scripts & styles and adding a * settings page and menu. */ public static function init() { self::includes(); $plugin_basename = plugin_basename( plugin_dir_path( __DIR__ ) . 'anspress-question-answer.php' ); anspress()->add_filter( 'plugin_action_links_' . $plugin_basename, __CLASS__, 'add_action_links' ); anspress()->add_action( 'save_post', __CLASS__, 'ans_parent_post', 10, 2 ); anspress()->add_action( 'trashed_post', __CLASS__, 'trashed_post', 10, 2 ); anspress()->add_action( 'admin_enqueue_scripts', __CLASS__, 'enqueue_admin_styles' ); anspress()->add_action( 'admin_enqueue_scripts', __CLASS__, 'enqueue_admin_scripts' ); anspress()->add_action( 'admin_menu', __CLASS__, 'add_plugin_admin_menu' ); anspress()->add_action( 'parent_file', __CLASS__, 'fix_active_admin_menu', 1000 ); anspress()->add_action( 'admin_init', __CLASS__, 'init_actions' ); anspress()->add_action( 'parent_file', __CLASS__, 'tax_menu_correction' ); anspress()->add_action( 'load-post.php', __CLASS__, 'question_meta_box_class' ); anspress()->add_action( 'load-post-new.php', __CLASS__, 'question_meta_box_class' ); anspress()->add_action( 'admin_menu', __CLASS__, 'change_post_menu_label' ); anspress()->add_filter( 'wp_insert_post_data', __CLASS__, 'post_data_check', 99 ); anspress()->add_action( 'admin_head-nav-menus.php', __CLASS__, 'ap_menu_metaboxes' ); anspress()->add_filter( 'posts_clauses', __CLASS__, 'join_by_author_name', 10, 2 ); anspress()->add_action( 'get_pages', __CLASS__, 'get_pages', 10, 2 ); anspress()->add_action( 'wp_insert_post_data', __CLASS__, 'modify_answer_title', 10, 2 ); anspress()->add_action( 'admin_footer-edit.php', __CLASS__, 'append_post_status_list_edit' ); anspress()->add_action( 'admin_footer-post.php', __CLASS__, 'append_post_status_list' ); anspress()->add_action( 'admin_footer-post-new.php', __CLASS__, 'append_post_status_list' ); anspress()->add_action( 'admin_post_anspress_update_db', __CLASS__, 'update_db' ); anspress()->add_action( 'admin_post_anspress_create_base_page', __CLASS__, 'anspress_create_base_page' ); anspress()->add_action( 'admin_notices', __CLASS__, 'anspress_notice' ); anspress()->add_action( 'ap_register_options', __CLASS__, 'register_options' ); anspress()->add_action( 'ap_after_field_markup', __CLASS__, 'page_select_field_opt' ); anspress()->add_action( 'admin_action_ap_addon_options', __CLASS__, 'ap_addon_options' ); anspress()->add_action( 'admin_action_ap_save_addon_options', __CLASS__, 'save_addon_options' ); anspress()->add_action( 'admin_footer', __CLASS__, 'admin_footer' ); } /** * Include files required in wp-admin */ public static function includes() { require_once 'functions.php'; new AP_license(); } /** * Register and enqueue admin-specific style sheet. */ public static function enqueue_admin_styles() { if ( ! ap_load_admin_assets() ) { return; } wp_enqueue_style( 'ap-admin-css', ANSPRESS_URL . 'assets/ap-admin.css', array(), AP_VERSION ); wp_enqueue_style( 'wp-color-picker' ); wp_enqueue_style( 'anspress-fonts', ap_get_theme_url( 'css/fonts.css' ), array(), AP_VERSION ); } /** * Register and enqueue admin-specific JavaScript. */ public static function enqueue_admin_scripts() { wp_register_script( 'anspress-common', ANSPRESS_URL . 'assets/js/common.js', array( 'jquery', 'jquery-form', 'backbone' ), AP_VERSION ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter wp_register_script( 'anspress-question', ANSPRESS_URL . 'assets/js/question.js', array( 'anspress-common' ), AP_VERSION ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter wp_register_script( 'anspress-ask', ANSPRESS_URL . 'assets/js/ask.js', array( 'anspress-common' ), AP_VERSION ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter wp_register_script( 'anspress-list', ANSPRESS_URL . 'assets/js/list.js', array( 'anspress-common' ), AP_VERSION ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter wp_register_script( 'anspress-notifiactions', ANSPRESS_URL . 'assets/js/notifications.js', array( 'anspress-common' ), AP_VERSION ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter wp_register_script( 'anspress-admin-js', ANSPRESS_URL . 'assets/js/ap-admin.js', array( 'anspress-common' ), AP_VERSION ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter wp_enqueue_script( 'selectize', ANSPRESS_URL . 'assets/js/lib/selectize.min.js', array( 'jquery' ), AP_VERSION, true ); $page = get_current_screen(); if ( ! ap_load_admin_assets() ) { return; } wp_enqueue_script( 'anspress-question' ); wp_enqueue_script( 'anspress-ask' ); wp_enqueue_script( 'anspress-list' ); wp_enqueue_script( 'anspress-notifiactions' ); wp_enqueue_script( 'anspress-admin-js' ); ?> <script type="text/javascript"> currentQuestionID = '<?php the_ID(); ?>'; apTemplateUrl = '<?php echo esc_url( ap_get_theme_url( 'js-template', false, false ) ); ?>'; aplang = {}; apShowComments = false; removeImage = '<?php esc_attr_e( 'Remove image', 'anspress-question-answer' ); ?>'; </script> <?php if ( 'post' === $page->base && 'question' === $page->post_type ) { wp_enqueue_script( 'ap-admin-app-js', ANSPRESS_URL . 'assets/js/admin-app.js', array(), AP_VERSION, true ); } wp_enqueue_script( 'postbox' ); } /** * Menu counter * * @return array * @since 2.4.6 */ public static function menu_counts() { $flagged = ap_total_flagged_count(); $q_flagged = $flagged['questions']; $a_flagged = $flagged['answers']; $question_count = wp_count_posts( 'question', 'readable' ); $answer_count = wp_count_posts( 'answer', 'readable' ); $types = array( 'question' => ( ! empty( $question_count->moderate ) ? $question_count->moderate : 0 ) + $q_flagged->total, 'answer' => ( ! empty( $answer_count->moderate ) ? $answer_count->moderate : 0 ) + $a_flagged->total, 'flagged' => $q_flagged->total + $a_flagged->total, ); $types['total'] = (int) $types['flagged']; $types_html = array(); foreach ( (array) $types as $k => $count ) { if ( $count > 0 ) { $types_html[ $k ] = ' <span class="update-plugins count ap-menu-counts"><span class="plugin-count">' . number_format_i18n( $count ) . '</span></span>'; } else { $types_html[ $k ] = ''; } } return $types_html; } /** * Register the administration menu for this plugin into the WordPress Dashboard menu. * * @since unknown * @since 4.2.0 Updated options menu title to `Settings`. */ public static function add_plugin_admin_menu() { if ( ! current_user_can( 'delete_pages' ) ) { return; } global $submenu; $counts = self::menu_counts(); $pos = self::get_free_menu_position( 12.11 ); add_menu_page( 'AnsPress', 'AnsPress' . $counts['total'], 'delete_pages', 'anspress', array( __CLASS__, 'dashboard_page' ), ANSPRESS_URL . 'assets/answer.png', $pos ); add_submenu_page( 'anspress', __( 'All Questions', 'anspress-question-answer' ), __( 'All Questions', 'anspress-question-answer' ) . $counts['question'], 'delete_pages', 'edit.php?post_type=question', '' ); add_submenu_page( 'anspress', __( 'New Question', 'anspress-question-answer' ), __( 'New Question', 'anspress-question-answer' ), 'delete_pages', 'post-new.php?post_type=question', '' ); add_submenu_page( 'anspress', __( 'All Answers', 'anspress-question-answer' ), __( 'All Answers', 'anspress-question-answer' ) . $counts['answer'], 'delete_pages', 'edit.php?post_type=answer', '' ); add_submenu_page( 'anspress', __( 'New Answer', 'anspress-question-answer' ), __( 'New Answer', 'anspress-question-answer' ), 'delete_pages', 'ap_select_question', array( __CLASS__, 'display_select_question' ) ); /** * Action hook for adding custom menu in wp-admin. * * @since unknown */ do_action( 'ap_admin_menu' ); add_submenu_page( 'anspress', __( 'AnsPress Settings', 'anspress-question-answer' ), __( 'Settings', 'anspress-question-answer' ), 'manage_options', 'anspress_options', array( __CLASS__, 'display_plugin_options_page' ) ); // Theme & Extensions submenu item link. $submenu['anspress'][500] = array( // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited '<div id="anspress-submenu-external-link">' . esc_html__( 'Theme & Extensions', 'anspress-question-answer' ) . '</div>', 'manage_options', 'https://anspress.net/themes/', ); } /** * Fix active menu css class in wp-admin. * * @param string $parent_file Parent file. * @return string * @since unknown */ public static function fix_active_admin_menu( $parent_file ) { global $submenu_file, $current_screen; // Set correct active/current menu and submenu in the WordPress Admin menu for the "example_cpt" Add-New/Edit/List. if ( in_array( $current_screen->post_type, array( 'question', 'answer' ), true ) ) { $submenu_file = 'edit.php?post_type=' . $current_screen->post_type; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited if ( 'add' === $current_screen->action ) { $submenu_file = 'post-new.php?post_type=' . $current_screen->post_type; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited } $parent_file = 'anspress'; } return $parent_file; } /** * Get free unused menu position. This function helps prevent other plugin * menu conflict when assigned to same position. * * @param integer $start position. * @param double $increment position. */ public static function get_free_menu_position( $start, $increment = 0.99 ) { $menus_positions = array_keys( $GLOBALS['menu'] ); if ( ! in_array( $start, $menus_positions, true ) ) { return $start; } // This position is already reserved find the closet one. while ( in_array( $start, $menus_positions, true ) ) { $start += $increment; } return $start; } /** * Highlight the proper top level menu. * * @param string $parent_file parent menu item. * @return string */ public static function tax_menu_correction( $parent_file ) { global $current_screen; $taxonomy = $current_screen->taxonomy; if ( 'question_category' === $taxonomy || 'question_tag' === $taxonomy || 'question_label' === $taxonomy || 'rank' === $taxonomy || 'badge' === $taxonomy ) { $parent_file = 'anspress'; } return $parent_file; } /** * Render the settings page for this plugin. */ public static function display_plugin_options_page() { include_once 'views/options.php'; } /** * Load dashboard page layout. * * @since 2.4 */ public static function dashboard_page() { include_once 'views/dashboard.php'; } /** * Control the output of question selection. * * @return void * @since 2.0.0 */ public static function display_select_question() { include_once 'views/select_question.php'; } /** * Add settings action link to the plugins page. * * @param string $links Pugin action links. */ public static function add_action_links( $links ) { return array_merge( $links, array( 'settings' => '<a href="' . admin_url( 'admin.php?page=anspress_options' ) . '">' . __( 'Settings', 'anspress-question-answer' ) . '</a>', ) ); } /** * Hook to run on init */ public static function init_actions() { $GLOBALS['wp']->add_query_var( 'post_parent' ); // Flush_rules if option updated. if ( isset( $_GET['page'] ) && ('anspress_options' === $_GET['page']) && isset( $_GET['settings-updated'] ) && $_GET['settings-updated'] ) { // @codingStandardsIgnoreLine. $options = ap_opt(); $page = get_page( ap_opt( 'base_page' ) ); $options['base_page_slug'] = $page->post_name; update_option( 'anspress_opt', $options ); ap_opt( 'ap_flush', 'true' ); } // If creating a new question then first set a question ID. global $typenow; global $pagenow; if ( in_array( $pagenow, array( 'post-new.php' ), true ) && 'answer' === $typenow && ! isset( $_GET['post_parent'] ) // @codingStandardsIgnoreLine. ) { wp_safe_redirect( admin_url( 'admin.php?page=ap_select_question' ) ); exit; } add_filter( 'pre_get_posts', array( __CLASS__, 'serach_qa_by_userid' ) ); } /** * Question meta box. */ public static function question_meta_box_class() { require_once 'meta-box.php'; new AP_Question_Meta_Box(); } /** * Save anspress user roles. * * @param integer $user_id User ID. */ public static function save_user_roles_fields( $user_id ) { update_user_meta( $user_id, 'ap_role', ap_sanitize_unslash( 'ap_role', 'p' ) ); } /** * Change post menu label. */ public static function change_post_menu_label() { global $submenu; $submenu['anspress'][0][0] = 'AnsPress'; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited } /** * Set answer CPT post parent when saving. * * @param integer $post_id Post ID. * @param object $post Post Object. * @since 2.0.0 */ public static function ans_parent_post( $post_id, $post ) { global $pagenow, $wpdb; if ( ! in_array( $pagenow, array( 'post.php', 'post-new.php' ), true ) ) { return; } if ( ! current_user_can( 'edit_post', $post->ID ) ) { return; } if ( 'answer' === $post->post_type ) { $parent_q = (int) ap_sanitize_unslash( 'post_parent', 'p' ); if ( empty( $parent_q ) ) { return; } else { $wpdb->update( $wpdb->posts, array( 'post_parent' => $parent_q ), array( 'ID' => $post->ID ) ); // phpcs:ignore WordPress.DB } } } /** * Delete page check transient after AnsPress pages are deleted. * * @param integer $post_id Page ID. * @return void * @since 4.1.0 */ public static function trashed_post( $post_id ) { $_post = get_post( $post_id ); if ( 'page' === $_post->post_type ) { $pages_slug = array( 'base_page', 'ask_page' ); $page_ids = array(); $opt = ap_opt(); foreach ( $pages_slug as $slug ) { $page_ids[] = $opt[ $slug ]; } if ( in_array( $_post->ID, $page_ids, true ) ) { delete_transient( 'ap_pages_check' ); } } } /** * [Not documented] * * @param array $data Post data array. * @return array */ public static function post_data_check( $data ) { global $pagenow; if ( 'post.php' === $pagenow && 'answer' === $data['post_type'] ) { $parent_q = ap_sanitize_unslash( 'ap_q', 'p' ); $parent_q = ! empty( $parent_q ) ? $parent_q : $data['post_parent']; if ( empty( $parent_q ) ) { add_filter( 'redirect_post_location', array( __CLASS__, 'custom_post_location' ), 99 ); return; } } return $data; } /** * Redirect to custom post location for error message. * * @param String $location redirect url. * @return string */ public static function custom_post_location( $location ) { remove_filter( 'redirect_post_location', __FUNCTION__, 99 ); $location = add_query_arg( 'message', 99, $location ); return $location; } /** * Hook menu meta box. * * @return void * @since unknown */ public static function ap_menu_metaboxes() { add_meta_box( 'anspress-menu-mb', 'AnsPress', array( __CLASS__, 'render_menu' ), 'nav-menus', 'side', 'high' ); } /** * Shows AnsPress menu meta box in WP menu editor. * * @return void * @since unknown */ public static function render_menu() { global $nav_menu_selected_id; $menu_items = ap_menu_obejct(); $walker = new Walker_Nav_Menu_Checklist( false ); $removed_args = array( 'action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce', ); ?> <div id="anspress-div"> <div id="tabs-panel-anspress-all" class="tabs-panel tabs-panel-active"> <ul id="anspress-checklist-pop" class="categorychecklist form-no-clear" > <?php echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $menu_items ), 0, (object) array( 'walker' => $walker ) ); ?> </ul> <p class="button-controls"> <span class="list-controls"> <?php $url = add_query_arg( array( 'anspress-all' => 'all', 'selectall' => 1, ), remove_query_arg( $removed_args ) ); $url = $url . '#anspress-menu-mb'; ?> <a href="<?php echo esc_url( $url ); ?>" class="select-all anspress-menu-mb"><?php esc_attr_e( 'Select All', 'anspress-question-answer' ); ?></a> </span> <span class="add-to-menu"> <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu', 'anspress-question-answer' ); ?>" name="add-anspress-menu-item" id="submit-anspress-div" /> <span class="spinner"></span> </span> </p> </div> <?php } /** * Add author args in query. * * @param object $query WP_Query object. */ public static function serach_qa_by_userid( $query ) { $screen = get_current_screen(); if ( isset( $query->query_vars['s'], $screen->id, $screen->post_type ) && ( ( 'edit-question' === $screen->id && 'question' === $screen->post_type ) || ( 'edit-answer' === $screen->id && 'answer' === $screen->post_type ) ) && $query->is_main_query() ) { $search_q = ap_parse_search_string( get_search_query() ); // Set author args. if ( ! empty( $search_q['author_id'] ) && is_array( $search_q['author_id'] ) ) { $user_ids = ''; foreach ( (array) $search_q['author_id'] as $id ) { $user_ids .= (int) $id . ','; } set_query_var( 'author', rtrim( $user_ids, ',' ) ); } elseif ( ! empty( $search_q['author_name'] ) && is_array( $search_q['author_name'] ) ) { $author_names = array(); foreach ( (array) $search_q['author_name'] as $id ) { $author_names[] = sanitize_title_for_query( $id ); } set_query_var( 'ap_author_name', $author_names ); } set_query_var( 's', $search_q['q'] ); } } /** * Filter comment clauses, join meta where key is _ap_flag * As pre_get_comments custom meta query not working so we are adding JOIN statement * * @param array $clauses WordPress comment clauses. * @return array */ public static function filter_comments_query( $clauses ) { global $wpdb; $clauses['join'] = "JOIN $wpdb->commentmeta ON $wpdb->comments.comment_ID = $wpdb->commentmeta.comment_id AND meta_key = '_ap_flag'"; return $clauses; } /** * Join users table in post table for searching posts by on user_login. * * @param array $pieces Wp_Query mysql clauses. * @param object $query Parent class. * @return array * @since 2.4 */ public static function join_by_author_name( $pieces, $query ) { if ( isset( $query->query_vars['ap_author_name'] ) && is_array( $query->query_vars['ap_author_name'] ) && count( $query->query_vars['ap_author_name'] ) > 0 ) { global $wpdb; $authors = $query->query_vars['ap_author_name']; $authors = implode( "','", array_map( 'sanitize_title_for_query', array_unique( (array) $authors ) ) ); $authors = "'" . rtrim( $authors, ",'" ) . "'"; $pieces['join'] = " JOIN $wpdb->users users ON users.ID = $wpdb->posts.post_author AND users.user_login IN ($authors)"; // @codingStandardsIgnoreLine. } return $pieces; } /** * Remove AnsPress base page from front page page select input. * * @param array $pages Page array. * @param array $r Arguments. * @return array */ public static function get_pages( $pages, $r ) { if ( isset( $r['name'] ) && 'page_on_front' === $r['name'] ) { foreach ( (array) $pages as $k => $page ) { if ( ap_opt( 'base_page' ) == $page->ID ) { // phpcs:disable Universal.Operators.StrictComparisons.LooseEqual unset( $pages[ $k ] ); } } } return $pages; } /** * Modify answer title before saving, in wp-admin. * * @param array $data Raw post data. * @return array */ public static function modify_answer_title( $data ) { if ( 'answer' === $data['post_type'] ) { $data['post_title'] = esc_html( get_the_title( $data['post_parent'] ) ); } return $data; } /** * Add AnsPress post status to bulk edit select box. */ public static function append_post_status_list_edit() { global $post; if ( in_array( $post->post_type, array( 'question', 'answer' ), true ) ) { echo '<script> jQuery( document ).ready( function() { jQuery( ".inline-edit-group select[name=\'_status\']" ).append( "<option value=\'moderate\'>' . esc_attr__( 'Moderate', 'anspress-question-answer' ) . '</option>" ); jQuery( ".inline-edit-group select[name=\'_status\']" ).append( "<option value=\'private_post\'>' . esc_attr__( 'Private Post', 'anspress-question-answer' ) . '</option>" ); } ); </script>'; } } /** * Add AnsPress post status to post edit select box. */ public static function append_post_status_list() { global $post; $label = ''; if ( in_array( $post->post_type, array( 'question', 'answer' ), true ) ) { if ( 'moderate' === $post->post_status ) { $label = esc_attr__( 'Moderate', 'anspress-question-answer' ); } elseif ( 'private_post' === $post->post_status ) { $label = esc_attr__( 'Private Post', 'anspress-question-answer' ); } echo '<script> jQuery( document ).ready( function() { jQuery( "select#post_status" ).append( "<option value=\'moderate\'' . ( 'moderate' === $post->post_status ? ' selected=\'selected\'' : '' ) . '>' . esc_attr__( 'Moderate', 'anspress-question-answer' ) . '</option>" ); jQuery( "select#post_status" ).append( "<option value=\'private_post\'' . ( 'private_post' === $post->post_status ? ' selected=\'selected\'' : '' ) . '>' . esc_attr__( 'Private Post', 'anspress-question-answer' ) . '</option>" );' . ( ( 'moderate' === $post->post_status || 'private_post' === $post->post_status ) ? 'jQuery( "select#post_status" ).closest( ".misc-pub-section" ).find( "#post-status-display" ).html( "' . esc_html( $label ) . '" );' : '' ) . ' } ); </script>'; } } /** * Show AnsPress notices. */ public static function anspress_notice() { $page = get_current_screen(); $anspress_updates = get_option( 'anspress_updates', array() ); $have_updates = empty( $anspress_updates ) || in_array( false, $anspress_updates, true ); $messages = array( 'db' => array( 'type' => 'error', 'message' => __( 'AnsPress database is not updated.', 'anspress-question-answer' ), 'button' => ' <a class="button" href="' . admin_url( 'admin-post.php?action=anspress_update_db' ) . '">' . __( 'Update now', 'anspress-question-answer' ) . '</a>', 'show' => ( get_option( 'anspress_db_version' ) != AP_DB_VERSION ), // phpcs:ignore Universal.Operators.StrictComparisons.LooseNotEqual ), 'missing_pages' => array( 'type' => 'error', 'message' => __( 'One or more AnsPress page(s) does not exists.', 'anspress-question-answer' ), 'button' => ' <a href="' . admin_url( 'admin-post.php?action=anspress_create_base_page' ) . '">' . __( 'Set automatically', 'anspress-question-answer' ) . '</a> ' . __( 'Or', 'anspress-question-answer' ) . ' <a href="' . admin_url( 'admin.php?page=anspress_options' ) . '">' . __( 'Set set by yourself', 'anspress-question-answer' ) . '</a>', 'show' => ( ! self::check_pages_exists() ), ), ); /** * Filter the AnsPress admin notices before they're output. * * @param array $messages List of notices. */ $messages = apply_filters( 'ap_admin_notices', $messages ); foreach ( $messages as $msg ) { if ( $msg['show'] ) { $class = 'ap-notice notice notice-' . $msg['type']; echo wp_kses_post( sprintf( '<div class="%1$s %4$s"><p>%2$s%3$s</p></div>', esc_attr( $class ), esc_html( $msg['message'] ), $msg['button'], 'apicon-anspress-icon' ) ); } } } /** * Check if AnsPress pages are exists. * * @return boolean * @since 4.1.0 */ private static function check_pages_exists() { $cache = get_transient( 'ap_pages_check' ); if ( false === $cache ) { $opt = ap_opt(); $pages_slug = array_keys( ap_main_pages() ); $pages_in = array(); foreach ( $pages_slug as $slug ) { if ( ! empty( $opt[ $slug ] ) ) { $pages_in[] = $opt[ $slug ]; } } $args = array( 'include' => $pages_in, 'post_type' => 'page', 'post_status' => 'publish', ); $pages = get_posts( $args ); if ( count( $pages ) < count( $pages_slug ) ) { $cache = '0'; set_transient( 'ap_pages_check', '0', HOUR_IN_SECONDS ); } else { set_transient( 'ap_pages_check', '1', HOUR_IN_SECONDS ); $cache = '1'; } } return '0' === $cache ? false : true; } /** * Updates AnsPress DB tables. */ public static function update_db() { if ( current_user_can( 'manage_options' ) ) { require_once ANSPRESS_DIR . '/activate.php'; $activate = \AP_Activate::get_instance(); $activate->insert_tables(); update_option( 'anspress_db_version', AP_DB_VERSION ); } wp_redirect( admin_url( 'admin.php?page=anspress_options' ) ); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect exit; } /** * Create a page and set it as base page. */ public static function anspress_create_base_page() { if ( current_user_can( 'manage_options' ) ) { ap_create_base_page(); flush_rewrite_rules(); delete_transient( 'ap_pages_check' ); } wp_redirect( admin_url( 'admin.php?page=anspress_options' ) );// phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect exit; } /** * Register all AnsPress options. * * @return void * @since 4.1.0 */ public static function register_options() { add_filter( 'ap_form_options_general_pages', array( __CLASS__, 'options_general_pages' ) ); add_filter( 'ap_form_options_general_permalinks', array( __CLASS__, 'options_general_permalinks' ) ); add_filter( 'ap_form_options_general_layout', array( __CLASS__, 'options_general_layout' ) ); add_filter( 'ap_form_options_postscomments', array( __CLASS__, 'options_postscomments' ) ); add_filter( 'ap_form_options_uac_reading', array( __CLASS__, 'options_uac_reading' ) ); add_filter( 'ap_form_options_uac_posting', array( __CLASS__, 'options_uac_posting' ) ); add_filter( 'ap_form_options_uac_other', array( __CLASS__, 'options_uac_other' ) ); add_filter( 'ap_form_options_user_activity', array( __CLASS__, 'options_user_activity' ) ); } /** * Register AnsPress general pages options. * * @return array * @since 4.1.0 */ public static function options_general_pages() { $opt = ap_opt(); $form = array( 'submit_label' => __( 'Save Pages', 'anspress-question-answer' ), 'fields' => array( 'author_credits' => array( 'label' => __( 'Hide author credits', 'anspress-question-answer' ), 'desc' => __( 'Hide link to AnsPress project site.', 'anspress-question-answer' ), 'type' => 'checkbox', 'order' => 0, 'value' => $opt['author_credits'], ), 'sep-warning' => array( 'html' => '<div class="ap-uninstall-warning">' . __( 'If you have created main pages manually then make sure to have [anspress] shortcode in all pages.', 'anspress-question-answer' ) . '</div>', ), ), ); foreach ( ap_main_pages() as $slug => $args ) { $value = isset( $opt[ $slug ] ) ? $opt[ $slug ] : ''; $form['fields'][ $slug ] = array( 'label' => $args['label'], 'desc' => $args['desc'], 'type' => 'select', 'options' => 'posts', 'posts_args' => array( 'post_type' => 'page', 'showposts' => -1, ), 'value' => $value, 'sanitize' => 'absint', ); } /** * Filter to override pages options form. * * @param array $form Form arguments. * @since 4.1.0 */ return apply_filters( 'ap_options_form_pages', $form ); } /** * Register permalinks options. * * @return array * @since 4.1.0 */ public static function options_general_permalinks() { $opt = ap_opt(); $form = array( 'submit_label' => __( 'Save Permalinks', 'anspress-question-answer' ), 'fields' => array( 'question_page_slug' => array( 'label' => __( 'Question slug', 'anspress-question-answer' ), 'desc' => __( 'Slug for single question page.', 'anspress-question-answer' ), 'value' => $opt['question_page_slug'], 'validate' => 'required', ), 'question_page_permalink' => array( 'label' => __( 'Question permalink', 'anspress-question-answer' ), 'desc' => __( 'Select single question permalink structure.', 'anspress-question-answer' ), 'type' => 'radio', 'options' => array( 'question_perma_1' => home_url( '/' . ap_base_page_slug() ) . '/<b class="ap-base-slug">' . ap_opt( 'question_page_slug' ) . '</b>/question-name/', 'question_perma_2' => home_url( '/' ) . '<b class="ap-base-slug">' . ap_opt( 'question_page_slug' ) . '</b>/question-name/', 'question_perma_3' => home_url( '/' ) . '<b class="ap-base-slug">' . ap_opt( 'question_page_slug' ) . '</b>/213/', 'question_perma_4' => home_url( '/' ) . '<b class="ap-base-slug">' . ap_opt( 'question_page_slug' ) . '</b>/213/question-name/', 'question_perma_5' => home_url( '/' ) . '<b class="ap-base-slug">' . ap_opt( 'question_page_slug' ) . '</b>/question-name/213/', 'question_perma_6' => home_url( '/' ) . '<b class="ap-base-slug">' . ap_opt( 'question_page_slug' ) . '</b>/213-question-name/', 'question_perma_7' => home_url( '/' ) . '<b class="ap-base-slug">' . ap_opt( 'question_page_slug' ) . '</b>/question-name-213/', ), 'value' => $opt['question_page_permalink'], 'validate' => 'required', ), 'base_page_title' => array( 'label' => __( 'Base page title', 'anspress-question-answer' ), 'desc' => __( 'Main questions list page title', 'anspress-question-answer' ), 'value' => $opt['base_page_title'], 'validate' => 'required', ), 'search_page_title' => array( 'label' => __( 'Search page title', 'anspress-question-answer' ), 'desc' => __( 'Title of the search page', 'anspress-question-answer' ), 'value' => $opt['search_page_title'], 'validate' => 'required', ), 'author_page_title' => array( 'label' => __( 'Author page title', 'anspress-question-answer' ), 'desc' => __( 'Title of the author page', 'anspress-question-answer' ), 'value' => empty( $opt['author_page_title'] ) ? 'User' : $opt['author_page_title'], 'validate' => 'required', ), ), ); /** * Filter to override permalinks options form. * * @param array $form Form arguments. * @since 4.1.0 */ return apply_filters( 'ap_options_form_permalinks', $form ); } /** * Register AnsPress general layout options. * * @return array * @since 4.1.0 */ public static function options_general_layout() { $opt = ap_opt(); $form = array( 'fields' => array( 'load_assets_in_anspress_only' => array( 'name' => '', 'label' => __( 'Load assets in AnsPress page only?', 'anspress-question-answer' ), 'desc' => __( 'Check this to load AnsPress JS and CSS on the AnsPress page only. Be careful, this might break layout.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['load_assets_in_anspress_only'], ), 'avatar_size_list' => array( 'label' => __( 'List avatar size', 'anspress-question-answer' ), 'desc' => __( 'User avatar size for questions list.', 'anspress-question-answer' ), 'subtype' => 'number', 'value' => $opt['avatar_size_list'], ), 'avatar_size_qquestion' => array( 'label' => __( 'Question avatar size', 'anspress-question-answer' ), 'desc' => __( 'User avatar size for question.', 'anspress-question-answer' ), 'subtype' => 'number', 'value' => $opt['avatar_size_qquestion'], ), 'avatar_size_qanswer' => array( 'label' => __( 'Answer avatar size', 'anspress-question-answer' ), 'desc' => __( 'User avatar size for answer.', 'anspress-question-answer' ), 'subtype' => 'number', 'value' => $opt['avatar_size_qanswer'], ), 'avatar_size_qcomment' => array( 'label' => __( 'Comment avatar size', 'anspress-question-answer' ), 'desc' => __( 'User avatar size for comments.', 'anspress-question-answer' ), 'subtype' => 'number', 'value' => $opt['avatar_size_qcomment'], ), 'question_per_page' => array( 'label' => __( 'Questions per page', 'anspress-question-answer' ), 'desc' => __( 'Questions to show per page.', 'anspress-question-answer' ), 'subtype' => 'number', 'value' => $opt['question_per_page'], ), 'answers_per_page' => array( 'label' => __( 'Answers per page', 'anspress-question-answer' ), 'desc' => __( 'Answers to show per page.', 'anspress-question-answer' ), 'subtype' => 'number', 'value' => $opt['answers_per_page'], ), ), ); /** * Filter to override layout options form. * * @param array $form Form arguments. * @since 4.1.0 */ return apply_filters( 'ap_options_form_layout', $form ); } /** * Register UAC reading options. * * @return array * @since 4.1.0 */ public static function options_uac_reading() { $opt = ap_opt(); $form = array( 'fields' => array( 'read_question_per' => array( 'label' => __( 'Who can read question?', 'anspress-question-answer' ), 'desc' => __( 'Set who can view or read a question.', 'anspress-question-answer' ), 'type' => 'select', 'value' => $opt['read_question_per'], 'options' => array( 'anyone' => __( 'Anyone, including non-loggedin', 'anspress-question-answer' ), 'logged_in' => __( 'Only logged in', 'anspress-question-answer' ), 'have_cap' => __( 'Only user having ap_read_question capability', 'anspress-question-answer' ), ), ), 'read_answer_per' => array( 'label' => __( 'Who can read answers?', 'anspress-question-answer' ), 'desc' => __( 'Set who can view or read a answer.', 'anspress-question-answer' ), 'type' => 'select', 'value' => $opt['read_answer_per'], 'options' => array( 'anyone' => __( 'Anyone, including non-loggedin', 'anspress-question-answer' ), 'logged_in' => __( 'Only logged in', 'anspress-question-answer' ), 'have_cap' => __( 'Only user having ap_read_answer capability', 'anspress-question-answer' ), ), ), 'read_comment_per' => array( 'label' => __( 'Who can read comment?', 'anspress-question-answer' ), 'desc' => __( 'Set who can view or read a comment.', 'anspress-question-answer' ), 'type' => 'select', 'value' => $opt['read_comment_per'], 'options' => array( 'anyone' => __( 'Anyone, including non-loggedin', 'anspress-question-answer' ), 'logged_in' => __( 'Only logged in', 'anspress-question-answer' ), 'have_cap' => __( 'Only user having ap_read_comment capability', 'anspress-question-answer' ), ), ), ), ); return $form; } /** * Register AnsPress user access control options. * * @return array * @since 4.1.0 */ public static function options_uac_posting() { $opt = ap_opt(); $form = array( 'fields' => array( 'post_question_per' => array( 'label' => __( 'Who can post question?', 'anspress-question-answer' ), 'desc' => __( 'Set who can submit a question from frontend.', 'anspress-question-answer' ), 'type' => 'select', 'value' => $opt['post_question_per'], 'options' => array( 'anyone' => __( 'Anyone, including non-loggedin', 'anspress-question-answer' ), 'logged_in' => __( 'Only logged in', 'anspress-question-answer' ), 'have_cap' => __( 'Only user having ap_new_question capability', 'anspress-question-answer' ), ), ), 'post_answer_per' => array( 'label' => __( 'Who can post answer?', 'anspress-question-answer' ), 'desc' => __( 'Set who can submit an answer from frontend.', 'anspress-question-answer' ), 'type' => 'select', 'value' => $opt['post_answer_per'], 'options' => array( 'anyone' => __( 'Anyone, including non-loggedin', 'anspress-question-answer' ), 'logged_in' => __( 'Only logged in', 'anspress-question-answer' ), 'have_cap' => __( 'Only user having ap_new_answer capability', 'anspress-question-answer' ), ), ), 'create_account' => array( 'label' => __( 'Create account for non-registered', 'anspress-question-answer' ), 'desc' => __( 'Allow non-registered users to create account by entering their email in question. After submitting post a confirmation email will be sent to the user.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['create_account'], ), 'multiple_answers' => array( 'label' => __( 'Multiple answers', 'anspress-question-answer' ), 'desc' => __( 'Allow users to submit multiple answer per question.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['multiple_answers'], ), 'disallow_op_to_answer' => array( 'label' => __( 'OP can answer?', 'anspress-question-answer' ), 'desc' => __( 'OP: Original poster/asker. Enabling this option will prevent users to post an answer on their question.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['disallow_op_to_answer'], ), 'post_comment_per' => array( 'label' => __( 'Who can post comment?', 'anspress-question-answer' ), 'desc' => __( 'Set who can submit a comment from frontend.', 'anspress-question-answer' ), 'type' => 'select', 'value' => $opt['post_comment_per'], 'options' => array( 'anyone' => __( 'Anyone, including non-loggedin', 'anspress-question-answer' ), 'logged_in' => __( 'Only logged in', 'anspress-question-answer' ), 'have_cap' => __( 'Only user having ap_new_comment capability', 'anspress-question-answer' ), ), ), 'new_question_status' => array( 'label' => __( 'Status of new question', 'anspress-question-answer' ), 'desc' => __( 'Default status of new question.', 'anspress-question-answer' ), 'type' => 'select', 'options' => array( 'publish' => __( 'Publish', 'anspress-question-answer' ), 'moderate' => __( 'Moderate', 'anspress-question-answer' ), ), 'value' => $opt['new_question_status'], ), 'edit_question_status' => array( 'label' => __( 'Status of edited question', 'anspress-question-answer' ), 'desc' => __( 'Default status of edited question.', 'anspress-question-answer' ), 'type' => 'select', 'options' => array( 'publish' => __( 'Publish', 'anspress-question-answer' ), 'moderate' => __( 'Moderate', 'anspress-question-answer' ), ), 'value' => $opt['edit_question_status'], ), 'new_answer_status' => array( 'label' => __( 'Status of new answer', 'anspress-question-answer' ), 'desc' => __( 'Default status of new answer.', 'anspress-question-answer' ), 'type' => 'select', 'options' => array( 'publish' => __( 'Publish', 'anspress-question-answer' ), 'moderate' => __( 'Moderate', 'anspress-question-answer' ), ), 'value' => $opt['new_answer_status'], ), 'edit_answer_status' => array( 'label' => __( 'Status of edited answer', 'anspress-question-answer' ), 'desc' => __( 'Default status of edited answer.', 'anspress-question-answer' ), 'type' => 'select', 'options' => array( 'publish' => __( 'Publish', 'anspress-question-answer' ), 'moderate' => __( 'Moderate', 'anspress-question-answer' ), ), 'value' => $opt['edit_answer_status'], ), 'anonymous_post_status' => array( 'label' => __( 'Status of non-loggedin post', 'anspress-question-answer' ), 'desc' => __( 'Default status of question or answer submitted by non-loggedin user.', 'anspress-question-answer' ), 'type' => 'select', 'options' => array( 'publish' => __( 'Publish', 'anspress-question-answer' ), 'moderate' => __( 'Moderate', 'anspress-question-answer' ), ), 'value' => $opt['anonymous_post_status'], ), ), ); /** * Filter to override UAC options form. * * @param array $form Form arguments. * @since 4.1.0 */ return apply_filters( 'ap_options_form_uac', $form ); } /** * Register other UAC options. * * @return array * @since 4.1.0 */ public static function options_uac_other() { $opt = ap_opt(); $form = array( 'fields' => array( 'allow_upload' => array( 'label' => __( 'Allow image upload', 'anspress-question-answer' ), 'desc' => __( 'Allow logged-in users to upload image.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['allow_upload'], ), 'uploads_per_post' => array( 'label' => __( 'Max uploads per post', 'anspress-question-answer' ), 'desc' => __( 'Set numbers of media user can upload for each post.', 'anspress-question-answer' ), 'value' => $opt['uploads_per_post'], ), 'max_upload_size' => array( 'label' => __( 'Max upload size', 'anspress-question-answer' ), 'desc' => __( 'Set maximum upload size in bytes.', 'anspress-question-answer' ), 'value' => $opt['max_upload_size'], ), 'allowed_file_mime' => array( 'label' => __( 'Allowed file mime types', 'anspress-question-answer' ), 'desc' => __( "Enter comma separated file mime. Format: extension(s) => MIME type.\nUse | for multiple file types and ensure each entry is on a new line.\nExample: jpeg|jpg=>image/jpeg", 'anspress-question-answer' ), 'value' => $opt['allowed_file_mime'], 'type' => 'textarea', 'validate' => 'required,valid_mimes', ), 'allow_private_posts' => array( 'label' => __( 'Allow private posts', 'anspress-question-answer' ), 'desc' => __( 'Allows users to create private question and answer. Private Q&A are only visible to admin and moderators.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['allow_private_posts'], ), 'trashing_question_with_answer' => array( 'label' => __( 'Trashing Question', 'anspress-question-answer' ), 'desc' => __( 'Disable trashing the question if there are answers already available to the question.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['trashing_question_with_answer'], ), 'deleting_question_with_answer' => array( 'label' => __( 'Deleting Question', 'anspress-question-answer' ), 'desc' => __( 'Disable deleting the question permanently if there are answers already available to the question.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['deleting_question_with_answer'], ), ), ); return $form; } /** * Register AnsPress QA options. * * @return array * @since 4.1.0 */ public static function options_postscomments() { $opt = ap_opt(); $form = array( 'fields' => array( 'comment_number' => array( 'label' => __( 'Numbers of comments to show', 'anspress-question-answer' ), 'desc' => __( 'Numbers of comments to load in each query?', 'anspress-question-answer' ), 'value' => $opt['comment_number'], 'subtype' => 'number', ), 'duplicate_check' => array( 'label' => __( 'Check duplicate', 'anspress-question-answer' ), 'desc' => __( 'Check for duplicate posts before posting', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['duplicate_check'], ), 'disable_q_suggestion' => array( 'label' => __( 'Disable question suggestion', 'anspress-question-answer' ), 'desc' => __( 'Checking this will disable question suggestion in ask form', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['disable_q_suggestion'], ), 'default_date_format' => array( 'label' => __( 'Show default date format', 'anspress-question-answer' ), 'desc' => __( 'Instead of showing time passed i.e. 1 Hour ago, show default format date.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['default_date_format'], ), 'show_solved_prefix' => array( 'label' => __( 'Show solved prefix', 'anspress-question-answer' ), 'desc' => __( 'If an answer is selected for question then [solved] prefix will be added in title.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['show_solved_prefix'], 'validate' => 'required', ), 'question_order_by' => array( 'label' => __( 'Default question order', 'anspress-question-answer' ), 'desc' => __( 'Order question list by default using selected', 'anspress-question-answer' ), 'type' => 'select', 'options' => array( 'voted' => __( 'Voted', 'anspress-question-answer' ), 'active' => __( 'Active', 'anspress-question-answer' ), 'newest' => __( 'Newest', 'anspress-question-answer' ), 'oldest' => __( 'Oldest', 'anspress-question-answer' ), ), 'value' => $opt['question_order_by'], ), 'keep_stop_words' => array( 'label' => __( 'Keep stop words in question slug', 'anspress-question-answer' ), 'desc' => __( 'AnsPress will not strip stop words in question slug.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['keep_stop_words'], ), 'minimum_qtitle_length' => array( 'label' => __( 'Minimum title length', 'anspress-question-answer' ), 'desc' => __( 'Set minimum letters for a question title.', 'anspress-question-answer' ), 'subtype' => 'number', 'value' => $opt['minimum_qtitle_length'], ), 'minimum_question_length' => array( 'label' => __( 'Minimum question content', 'anspress-question-answer' ), 'desc' => __( 'Set minimum letters for a question contents.', 'anspress-question-answer' ), 'subtype' => 'number', 'value' => $opt['minimum_question_length'], ), 'question_text_editor' => array( 'label' => __( 'Question editor?', 'anspress-question-answer' ), 'desc' => __( 'Quick tags editor', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['question_text_editor'], ), 'answer_text_editor' => array( 'label' => __( 'Answer editor?', 'anspress-question-answer' ), 'desc' => __( 'Quick tags editor', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['answer_text_editor'], ), 'disable_comments_on_question' => array( 'label' => __( 'Disable comments', 'anspress-question-answer' ), 'desc' => __( 'Disable comments on questions.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['disable_comments_on_question'], ), 'disable_voting_on_question' => array( 'label' => __( 'Disable voting', 'anspress-question-answer' ), 'desc' => __( 'Disable voting on questions.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['disable_voting_on_question'], ), 'disable_down_vote_on_question' => array( 'label' => __( 'Disable down voting', 'anspress-question-answer' ), 'desc' => __( 'Disable down voting on questions.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['disable_down_vote_on_question'], ), 'close_selected' => array( 'label' => __( 'Close question after selecting answer', 'anspress-question-answer' ), 'desc' => __( 'If enabled this will prevent user to submit answer on solved question.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['close_selected'], ), 'answers_sort' => array( 'label' => __( 'Default answers order', 'anspress-question-answer' ), 'desc' => __( 'Order answers by by default using selected', 'anspress-question-answer' ), 'type' => 'select', 'options' => array( 'voted' => __( 'Voted', 'anspress-question-answer' ), 'active' => __( 'Active', 'anspress-question-answer' ), 'newest' => __( 'Newest', 'anspress-question-answer' ), 'oldest' => __( 'Oldest', 'anspress-question-answer' ), ), 'value' => $opt['answers_sort'], ), 'minimum_ans_length' => array( 'label' => __( 'Minimum answer content', 'anspress-question-answer' ), 'desc' => __( 'Set minimum letters for a answer contents.', 'anspress-question-answer' ), 'subtype' => 'number', 'value' => $opt['minimum_ans_length'], ), 'disable_comments_on_answer' => array( 'label' => __( 'Disable comments', 'anspress-question-answer' ), 'desc' => __( 'Disable comments on answer.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['disable_comments_on_answer'], ), 'disable_voting_on_answer' => array( 'label' => __( 'Disable voting', 'anspress-question-answer' ), 'desc' => __( 'Disable voting on answers.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['disable_voting_on_answer'], ), 'disable_down_vote_on_answer' => array( 'label' => __( 'Disable down voting', 'anspress-question-answer' ), 'desc' => __( 'Disable down voting on answers.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['disable_down_vote_on_answer'], ), ), ); /** * Filter to override post and comments options form. * * @param array $form Form arguments. * @since 4.1.0 */ return apply_filters( 'ap_options_form_postscomments', $form ); } /** * Register AnsPress user's activity options. * * @return array * @since 4.1.8 */ public static function options_user_activity() { global $wp_roles; $opt = ap_opt(); $roles = array(); foreach ( $wp_roles->roles as $key => $role ) { $roles[ $key ] = $role['name']; } $form = array( 'fields' => array( 'activity_exclude_roles' => array( 'label' => __( 'Select the roles to exclude in activity feed.', 'anspress-question-answer' ), 'desc' => __( 'Selected role\'s activities will be excluded in site activity feed.', 'anspress-question-answer' ), 'type' => 'checkbox', 'value' => $opt['activity_exclude_roles'], 'options' => $roles, ), ), ); /** * Filter to user's activity option form. * * @param array $form Form arguments. * @since 4.1.8 */ return apply_filters( 'ap_options_form_user_activity', $form ); } /** * Add link to view, edit and create right next to page select field. * * @param object $field Field object. * @return void */ public static function page_select_field_opt( $field ) { $page_slugs = array_keys( ap_main_pages() ); // Return if not the field we are looking for. if ( ! in_array( $field->original_name, $page_slugs, true ) ) { return; } $field->add_html( ' <a href="' . esc_url( get_permalink( $field->value() ) ) . '">' . __( 'View page', 'anspress-question-answer' ) . '</a> ' ); $field->add_html( '<a href="' . esc_url( get_edit_post_link( $field->value() ) ) . '">' . __( 'Edit page', 'anspress-question-answer' ) . '</a>' ); } /** * Load addons options form in a thickbox. * * @return void */ public static function ap_addon_options() { // Bail if no permission. if ( ! current_user_can( 'manage_options' ) ) { exit; } define( 'IFRAME_REQUEST', true ); iframe_header(); wp_enqueue_style( 'anspress-main', ap_get_theme_url( 'css/main.css' ), array(), AP_VERSION ); wp_enqueue_style( 'ap-admin-css', ANSPRESS_URL . 'assets/ap-admin.css', array(), AP_VERSION ); wp_enqueue_style( 'anspress-fonts', ap_get_theme_url( 'css/fonts.css' ), array(), AP_VERSION ); ?> <script type="text/javascript"> currentQuestionID = '<?php the_ID(); ?>'; apTemplateUrl = '<?php echo esc_url( ap_get_theme_url( 'js-template', false, false ) ); ?>'; aplang = {}; apShowComments = false; removeImage = '<?php esc_attr_e( 'Remove image', 'anspress-question-answer' ); ?>'; </script> <?php wp_enqueue_script( 'anspress-question' ); wp_enqueue_script( 'anspress-ask' ); wp_enqueue_script( 'anspress-list' ); wp_enqueue_script( 'anspress-notifiactions' ); wp_enqueue_script( 'anspress-admin-js' ); $addon = ap_get_addon( ap_sanitize_unslash( 'addon', 'r' ) ); $from_args = array( 'form_action' => admin_url( 'admin.php?action=ap_save_addon_options&active_addon=' . $addon['id'] ), 'ajax_submit' => false, ); /** * Filter AnsPress add-on options form. * * @param array $form_args Array for form arguments. * @since 4.1.0 */ $form_args = apply_filters( 'ap_addon_form_args', $from_args ); $form_name = str_replace( '.php', '', $addon['id'] ); $form_name = str_replace( '/', '_', $form_name ); echo '<div class="ap-thickboxw">'; // Show updated notice. if ( ap_isset_post_value( 'updated' ) === '1' ) { echo '<div class="notice notice-success is-dismissible">'; echo '<p>' . esc_html__( 'Addon options updated successfully!', 'anspress-question-answer' ) . '</p>'; echo '</div>'; } if ( anspress()->form_exists( 'addon-' . $form_name ) ) { anspress()->get_form( 'addon-' . $form_name )->generate( $form_args ); } else { echo '<p class="ap-form-nofields">'; // translators: %s is name of wp hook. echo esc_attr( sprintf( __( 'There is no option registered by this addon. Custom options can be registered by using hook: %s', 'anspress-question-answer' ), 'ap_form_addon-' . $form_name ) ); echo '</p>'; } echo '</div>'; iframe_footer(); exit; } /** * Saves addons options and redirect back to addon form. * * @return void * @since 4.1.8 */ public static function save_addon_options() { // Bail if no permission. if ( ! current_user_can( 'manage_options' ) ) { exit; } $form_name = ap_sanitize_unslash( 'ap_form_name', 'r' ); $addon_name = ap_sanitize_unslash( 'active_addon', 'r' ); $addon = ap_get_active_addons( $addon_name ); $updated = false; // Process submit form. if ( ! empty( $form_name ) && anspress()->get_form( $form_name )->is_submitted() ) { $form = anspress()->get_form( $form_name ); $values = $form->get_values(); if ( ! $form->have_errors() ) { $options = get_option( 'anspress_opt', array() ); foreach ( $values as $key => $opt ) { $options[ $key ] = $opt['value']; } update_option( 'anspress_opt', $options ); wp_cache_delete( 'anspress_opt', 'ap' ); wp_cache_delete( 'anspress_opt', 'ap' ); $updated = true; // Flush rewrite rules. ap_opt( 'ap_flush', 'true' ); } } wp_redirect( admin_url( 'admin.php?action=ap_addon_options&addon=' . $addon_name . '&updated=' . $updated ) ); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect exit; } /** * Output custom script and styles in admin_footer. * * @return void * @since 4.1.8 */ public static function admin_footer() { ?> <style> #adminmenu .anspress-license-count{ background: #0073aa; } </style> <script type="text/javascript"> jQuery( document ).ready( function( $ ) { // Open the Theme & Extensions submenu link in a new tab/window. $( '#anspress-submenu-external-link' ).parent().attr( 'target', '_blank' ); } ); </script> <?php } }
Expand full source code Collapse full source code View on GitHub: admin/anspress-admin.php:29
Add your comment