AnsPress_PostTypes()
Description #
Custom post type.
Source #
File: includes/post-types.php
class AnsPress_PostTypes { /** * Initialize the class */ public static function init() { // Register Custom Post types and taxonomy. anspress()->add_action( 'init', __CLASS__, 'register_question_cpt', 0 ); anspress()->add_action( 'init', __CLASS__, 'register_answer_cpt', 0 ); anspress()->add_action( 'post_type_link', __CLASS__, 'post_type_link', 10, 4 ); anspress()->add_filter( 'post_type_archive_link', __CLASS__, 'post_type_archive_link', 10, 2 ); anspress()->add_filter( 'post_updated_messages', __CLASS__, 'post_updated_messages', 10 ); anspress()->add_filter( 'bulk_post_updated_messages', __CLASS__, 'bulk_post_updated_messages', 10, 2 ); } /** * Return question permalink structure. * * @return object * @since 4.1.0 */ public static function question_perm_structure() { $question_permalink = ap_opt( 'question_page_permalink' ); $question_slug = ap_get_page_slug( 'question' ); $rewrites = array(); if ( 'question_perma_2' === $question_permalink ) { $rewrites['rule'] = $question_slug . '/%question%'; } elseif ( 'question_perma_3' === $question_permalink ) { $rewrites['rule'] = $question_slug . '/%question_id%'; } elseif ( 'question_perma_4' === $question_permalink ) { $rewrites['rule'] = $question_slug . '/%question_id%/%question%'; } elseif ( 'question_perma_5' === $question_permalink ) { $rewrites['rule'] = $question_slug . '/%question%/%question_id%'; } elseif ( 'question_perma_6' === $question_permalink ) { $rewrites['rule'] = $question_slug . '/%question_id%-%question%'; } elseif ( 'question_perma_7' === $question_permalink ) { $rewrites['rule'] = $question_slug . '/%question%-%question_id%'; } else { $rewrites['rule'] = ap_base_page_slug() . '/' . $question_slug . '/%question%'; } /** * Allows filtering question permalink structure. * * @param array $rewrite Question permalink structure. * @since 4.1.0 */ return (object) apply_filters( 'ap_question_perm_structure', $rewrites ); } /** * Register question CPT. * * @since 2.0.1 */ public static function register_question_cpt() { add_rewrite_tag( '%question_id%', '([0-9]+)', 'post_type=question&p=' ); add_rewrite_tag( '%question%', '([^/]+)' ); // Question CPT labels. $labels = array( 'name' => _x( 'Questions', 'Post Type General Name', 'anspress-question-answer' ), 'singular_name' => _x( 'Question', 'Post Type Singular Name', 'anspress-question-answer' ), 'menu_name' => __( 'Questions', 'anspress-question-answer' ), 'parent_item_colon' => __( 'Parent question:', 'anspress-question-answer' ), 'all_items' => __( 'All questions', 'anspress-question-answer' ), 'view_item' => __( 'View question', 'anspress-question-answer' ), 'add_new_item' => __( 'Add new question', 'anspress-question-answer' ), 'add_new' => __( 'New question', 'anspress-question-answer' ), 'edit_item' => __( 'Edit question', 'anspress-question-answer' ), 'update_item' => __( 'Update question', 'anspress-question-answer' ), 'search_items' => __( 'Search questions', 'anspress-question-answer' ), 'not_found' => __( 'No question found', 'anspress-question-answer' ), 'not_found_in_trash' => __( 'No questions found in trash', 'anspress-question-answer' ), ); /** * Override default question CPT labels. * * @param array $labels Default question labels. */ $labels = apply_filters( 'ap_question_cpt_labels', $labels ); // Question CPT arguments. $args = array( 'label' => __( 'question', 'anspress-question-answer' ), 'description' => __( 'Question', 'anspress-question-answer' ), 'labels' => $labels, 'supports' => array( 'title', 'editor', 'author', 'comments', 'excerpt', 'trackbacks', 'revisions', 'custom-fields', 'buddypress-activity', ), 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => true, 'menu_icon' => ANSPRESS_URL . 'assets/question.png', 'can_export' => true, 'has_archive' => true, 'exclude_from_search' => true, 'publicly_queryable' => true, 'capability_type' => 'post', 'rewrite' => false, 'query_var' => 'question', 'delete_with_user' => true, ); /** * Filter default question CPT arguments. * * @param array $args CPT arguments. */ $args = apply_filters( 'ap_question_cpt_args', $args ); // Call it before registering cpt. AnsPress_Rewrite::rewrite_rules(); // Register CPT question. register_post_type( 'question', $args ); } /** * Register answer custom post type. * * @since 2.0 */ public static function register_answer_cpt() { // Answer CPT labels. $labels = array( 'name' => _x( 'Answers', 'Post Type General Name', 'anspress-question-answer' ), 'singular_name' => _x( 'Answer', 'Post Type Singular Name', 'anspress-question-answer' ), 'menu_name' => __( 'Answers', 'anspress-question-answer' ), 'parent_item_colon' => __( 'Parent answer:', 'anspress-question-answer' ), 'all_items' => __( 'All answers', 'anspress-question-answer' ), 'view_item' => __( 'View answer', 'anspress-question-answer' ), 'add_new_item' => __( 'Add new answer', 'anspress-question-answer' ), 'add_new' => __( 'New answer', 'anspress-question-answer' ), 'edit_item' => __( 'Edit answer', 'anspress-question-answer' ), 'update_item' => __( 'Update answer', 'anspress-question-answer' ), 'search_items' => __( 'Search answers', 'anspress-question-answer' ), 'not_found' => __( 'No answer found', 'anspress-question-answer' ), 'not_found_in_trash' => __( 'No answer found in trash', 'anspress-question-answer' ), ); /** * Filter default answer labels. * * @param array $labels Default answer labels. */ $labels = apply_filters( 'ap_answer_cpt_label', $labels ); // Answers CPT arguments. $args = array( 'label' => __( 'answer', 'anspress-question-answer' ), 'description' => __( 'Answer', 'anspress-question-answer' ), 'labels' => $labels, 'supports' => array( 'editor', 'author', 'comments', 'excerpt', 'revisions', 'custom-fields', ), 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'menu_icon' => ANSPRESS_URL . 'assets/answer.png', 'can_export' => true, 'has_archive' => true, 'exclude_from_search' => true, 'publicly_queryable' => true, 'capability_type' => 'post', 'rewrite' => false, 'query_var' => 'answer', ); /** * Filter default answer arguments. * * @param array $args Arguments. */ $args = apply_filters( 'ap_answer_cpt_args', $args ); // Register CPT answer. register_post_type( 'answer', $args ); } /** * Alter question and answer CPT permalink. * * @param string $link Link. * @param object $post Post object. * @param bool $leavename Whether to keep the post name. * @param bool $sample Is it a sample permalink. * @return string * @since 2.0.0 */ public static function post_type_link( $link, $post, $leavename, $sample ) { if ( 'question' === $post->post_type ) { $question_slug = ap_opt( 'question_page_permalink' ); if ( empty( $question_slug ) ) { $question_slug = 'question_perma_1'; } $default_lang = ''; // Support polylang permalink. if ( function_exists( 'pll_default_language' ) ) { $default_lang = pll_get_post_language( $post->ID ) ? pll_get_post_language( $post->ID ) : pll_default_language(); } if ( get_option( 'permalink_structure' ) ) { $structure = self::question_perm_structure(); $rule = str_replace( '%question_id%', $post->ID, $structure->rule ); $rule = str_replace( '%question%', ( $leavename ? '%question%' : $post->post_name ), $rule ); $link = home_url( $default_lang . '/' . $rule . '/' ); } else { $link = add_query_arg( array( 'question' => $post->ID ), ap_base_page_link() ); } /** * Allow overriding of question post type permalink * * @param string $link Question link. * @param object $post Post object. */ $link = apply_filters_deprecated( 'ap_question_post_type_link', array( $link, $post ), '4.4.0', 'ap_question_post_type_link_structure' ); /** * Allow overriding of question post type permalink * * @param string $link Question link. * @param object $post Post object. * @param bool $leavename Whether to keep the post name. * @param bool $sample Is it a sample permalink. */ $link = apply_filters( 'ap_question_post_type_link_structure', $link, $post, $leavename, $sample ); return $link; } elseif ( 'answer' === $post->post_type && 0 !== (int) $post->post_parent ) { $link = get_permalink( $post->post_parent ) . "answer/{$post->ID}/"; /** * Allow overriding of answer post type permalink. * * @param string $link Answer link. * @param object $post Post object. */ $link = apply_filters_deprecated( 'ap_answer_post_type_link', array( $link, $post ), '4.4.0', 'ap_answer_post_type_link_structure' ); /** * Allow overriding of answer post type permalink * * @param string $link Answer link. * @param object $post Post object. * @param bool $leavename Whether to keep the post name. * @param bool $sample Is it a sample permalink. */ $link = apply_filters( 'ap_answer_post_type_link_structure', $link, $post, $leavename, $sample ); return $link; } return $link; } /** * Filters the post type archive permalink. * * @param string $link The post type archive permalink. * @param string $post_type Post type name. * @since 4.1.0 */ public static function post_type_archive_link( $link, $post_type ) { if ( 'question' === $post_type ) { return get_permalink( ap_opt( 'base_page' ) ); } return $link; } /** * Filter the post updated messages to add Question and Answer * custom post type post updated messages. * * @param array[] $messages Post updated messages. */ public static function post_updated_messages( $messages ) { global $post; $permalink = get_permalink( $post->ID ); $scheduled_date = sprintf( /* translators: Publish box date string. 1: Date, 2: Time. */ __( '%1$s at %2$s', 'anspress-question-answer' ), /* translators: Publish box date format, see https://www.php.net/manual/datetime.format.php */ date_i18n( _x( 'M j, Y', 'publish box date format', 'anspress-question-answer' ), strtotime( $post->post_date ) ), /* translators: Publish box time format, see https://www.php.net/manual/datetime.format.php */ date_i18n( _x( 'H:i', 'publish box time format', 'anspress-question-answer' ), strtotime( $post->post_date ) ) ); // Post updated message for Question post type. $messages['question'] = array( 0 => '', // Unused. Messages start at index 1. /* translators: %s Question view URL. */ 1 => sprintf( __( 'Question updated. <a href="%s">View Question</a>', 'anspress-question-answer' ), esc_url( $permalink ) ), 2 => __( 'Custom field updated.', 'anspress-question-answer' ), 3 => __( 'Custom field deleted.', 'anspress-question-answer' ), 4 => __( 'Question updated.', 'anspress-question-answer' ), /* translators: %s: Date and time of the revision. */ 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Question restored to revision from %s.', 'anspress-question-answer' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, // phpcs:ignore WordPress.Security.NonceVerification.Recommended /* translators: %s: Question url */ 6 => sprintf( __( 'Question published. <a href="%s">View Question</a>', 'anspress-question-answer' ), esc_url( $permalink ) ), 7 => __( 'Question saved.', 'anspress-question-answer' ), /* translators: %s: Question url */ 8 => sprintf( __( 'Question submitted. <a target="_blank" href="%s">Preview question</a>', 'anspress-question-answer' ), esc_url( get_preview_post_link( $post ) ) ), 9 => sprintf( /* translators: 1: Scheduled date for the question 2: Question url */ __( 'Question scheduled for: %1$s. <a target="_blank" href="%2$s">Preview question</a>', 'anspress-question-answer' ), '<strong>' . $scheduled_date . '</strong>', esc_url( $permalink ) ), /* translators: %s: Question url */ 10 => sprintf( __( 'Question draft updated. <a target="_blank" href="%s">Preview question</a>', 'anspress-question-answer' ), esc_url( get_preview_post_link( $post ) ) ), ); // Post updated message for Answer post type. $messages['answer'] = array( 0 => '', // Unused. Messages start at index 1. /* translators: %s Answer view URL. */ 1 => sprintf( __( 'Answer updated. <a href="%s">View Answer</a>', 'anspress-question-answer' ), esc_url( $permalink ) ), 2 => __( 'Custom field updated.', 'anspress-question-answer' ), 3 => __( 'Custom field deleted.', 'anspress-question-answer' ), 4 => __( 'Answer updated.', 'anspress-question-answer' ), /* translators: %s: Date and time of the revision. */ 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Answer restored to revision from %s.', 'anspress-question-answer' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, // phpcs:ignore WordPress.Security.NonceVerification.Recommended /* translators: %s: Answer url */ 6 => sprintf( __( 'Answer published. <a href="%s">View Answer</a>', 'anspress-question-answer' ), esc_url( $permalink ) ), 7 => __( 'Answer saved.', 'anspress-question-answer' ), /* translators: %s: Answer url */ 8 => sprintf( __( 'Answer submitted. <a target="_blank" href="%s">Preview answer</a>', 'anspress-question-answer' ), esc_url( get_preview_post_link( $post ) ) ), 9 => sprintf( /* translators: 1: Scheduled date for the answer 2: Answer url */ __( 'Answer scheduled for: %1$s. <a target="_blank" href="%2$s">Preview answer</a>', 'anspress-question-answer' ), '<strong>' . $scheduled_date . '</strong>', esc_url( $permalink ) ), /* translators: %s: Answer url */ 10 => sprintf( __( 'Answer draft updated. <a target="_blank" href="%s">Preview answer</a>', 'anspress-question-answer' ), esc_url( get_preview_post_link( $post ) ) ), ); return $messages; } /** * Filter the bulk action updated messages to add Question and Answer * custom post type bulk post updated messages. * * @param array[] $bulk_messages Arrays of messages, each keyed by the corresponding post type. Messages are * keyed with 'updated', 'locked', 'deleted', 'trashed', and 'untrashed'. * @param int[] $bulk_counts Array of item counts for each message, used to build internationalized strings. */ public static function bulk_post_updated_messages( $bulk_messages, $bulk_counts ) { $bulk_messages['question'] = array( /* translators: %s: Number of questions. */ 'updated' => _n( '%s question updated.', '%s questions updated.', $bulk_counts['updated'], 'anspress-question-answer' ), 'locked' => ( 1 === $bulk_counts['locked'] ) ? __( '1 question not updated, somebody is editing it.', 'anspress-question-answer' ) : /* translators: %s: Number of questions. */ _n( '%s question not updated, somebody is editing it.', '%s questions not updated, somebody is editing them.', $bulk_counts['locked'], 'anspress-question-answer' ), /* translators: %s: Number of questions. */ 'deleted' => _n( '%s question permanently deleted.', '%s questions permanently deleted.', $bulk_counts['deleted'], 'anspress-question-answer' ), /* translators: %s: Number of questions. */ 'trashed' => _n( '%s question moved to the Trash.', '%s questions moved to the Trash.', $bulk_counts['trashed'], 'anspress-question-answer' ), /* translators: %s: Number of questions. */ 'untrashed' => _n( '%s question restored from the Trash.', '%s questions restored from the Trash.', $bulk_counts['untrashed'], 'anspress-question-answer' ), ); $bulk_messages['answer'] = array( /* translators: %s: Number of answers. */ 'updated' => _n( '%s answer updated.', '%s answers updated.', $bulk_counts['updated'], 'anspress-question-answer' ), 'locked' => ( 1 === $bulk_counts['locked'] ) ? __( '1 answer not updated, somebody is editing it.', 'anspress-question-answer' ) : /* translators: %s: Number of answers. */ _n( '%s answer not updated, somebody is editing it.', '%s answers not updated, somebody is editing them.', $bulk_counts['locked'], 'anspress-question-answer' ), /* translators: %s: Number of answers. */ 'deleted' => _n( '%s answer permanently deleted.', '%s answers permanently deleted.', $bulk_counts['deleted'], 'anspress-question-answer' ), /* translators: %s: Number of answers. */ 'trashed' => _n( '%s answer moved to the Trash.', '%s answers moved to the Trash.', $bulk_counts['trashed'], 'anspress-question-answer' ), /* translators: %s: Number of answers. */ 'untrashed' => _n( '%s answer restored from the Trash.', '%s answers restored from the Trash.', $bulk_counts['untrashed'], 'anspress-question-answer' ), ); return $bulk_messages; } }
Expand full source code Collapse full source code View on GitHub: includes/post-types.php:20
Add your comment