Last active
July 31, 2018 12:00
-
-
Save WadeTheFade/1dbaa65775548e0ccefc2e8cb354528a to your computer and use it in GitHub Desktop.
Currently edited for question_category
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Add category support in AnsPress questions. | |
* | |
* @author Rahul Aryan <support@anspress.io> | |
* @copyright 2014 AnsPress.io & Rahul Aryan | |
* @license GPL-3.0+ https://www.gnu.org/licenses/gpl-3.0.txt | |
* @link https://anspress.io | |
* @package AnsPress | |
* @subpackage Categories Addon | |
* @since 4.1.8 | |
*/ | |
namespace AnsPress\Addons; | |
// If this file is called directly, abort. | |
if ( ! defined( 'WPINC' ) ) { | |
die; | |
} | |
/** | |
* Categories addon class. | |
*/ | |
class Categories extends \AnsPress\Singleton { | |
/** | |
* Refers to a single instance of this class. | |
* | |
* @var null|object | |
* @since 4.1.8 | |
*/ | |
public static $instance = null; | |
/** | |
* Initialize the class. | |
* | |
* @since 4.0.0 | |
*/ | |
protected function __construct() { | |
ap_register_page( 'category', __( 'Category', 'anspress-question-answer' ), array( $this, 'category_page' ), false ); | |
ap_register_page( 'categories', __( 'Categories', 'anspress-question-answer' ), array( $this, 'categories_page' ) ); | |
//anspress()->add_action( 'init', $this, 'register_question_categories', 1 ); | |
anspress()->add_action( 'ap_form_addon-categories', $this, 'load_options' ); | |
anspress()->add_action( 'admin_enqueue_scripts', $this, 'admin_enqueue_scripts' ); | |
anspress()->add_action( 'ap_load_admin_assets', $this, 'ap_load_admin_assets' ); | |
anspress()->add_action( 'ap_admin_menu', $this, 'admin_category_menu' ); | |
anspress()->add_action( 'ap_display_question_metas', $this, 'ap_display_question_metas', 10, 2 ); | |
anspress()->add_action( 'ap_assets_js', $this, 'ap_assets_js' ); | |
anspress()->add_filter( 'term_link', $this, 'term_link_filter', 10, 3 ); | |
anspress()->add_action( 'ap_question_form_fields', $this, 'ap_question_form_fields' ); | |
anspress()->add_action( 'save_post_question', $this, 'after_new_question', 0, 2 ); | |
anspress()->add_filter( 'ap_breadcrumbs', $this, 'ap_breadcrumbs' ); | |
anspress()->add_action( 'terms_clauses', $this, 'terms_clauses', 10, 3 ); | |
anspress()->add_filter( 'ap_list_filters', $this, 'ap_list_filters' ); | |
anspress()->add_action( 'question_category_add_form_fields', $this, 'image_field_new' ); | |
anspress()->add_action( 'question_category_edit_form_fields', $this, 'image_field_edit' ); | |
anspress()->add_action( 'create_question_category', $this, 'save_image_field' ); | |
anspress()->add_action( 'edited_question_category', $this, 'save_image_field' ); | |
anspress()->add_action( 'ap_rewrites', $this, 'rewrite_rules', 10, 3 ); | |
anspress()->add_filter( 'ap_main_questions_args', $this, 'ap_main_questions_args' ); | |
anspress()->add_filter( 'ap_question_subscribers_action_id', $this, 'subscribers_action_id' ); | |
anspress()->add_filter( 'ap_ask_btn_link', $this, 'ap_ask_btn_link' ); | |
// anspress()->add_filter( 'ap_canonical_url', $this, 'ap_canonical_url' ); | |
anspress()->add_filter( 'wp_head', $this, 'category_feed' ); | |
anspress()->add_filter( 'manage_edit-question_category_columns', $this, 'column_header' ); | |
anspress()->add_filter( 'manage_question_category_custom_column', $this, 'column_content', 10, 3 ); | |
anspress()->add_filter( 'ap_current_page', $this, 'ap_current_page' ); | |
anspress()->add_action( 'posts_pre_query', $this, 'modify_query_category_archive', 9999, 2 ); | |
// List filtering. | |
anspress()->add_action( 'ap_ajax_load_filter_category', $this, 'load_filter_category' ); | |
anspress()->add_filter( 'ap_list_filter_active_category', $this, 'filter_active_category', 10, 2 ); | |
anspress()->add_action( 'widgets_init', $this, 'widget' ); | |
anspress()->add_filter( 'ap_question_cpt_args', function( $args ){ | |
$args['taxonomies'] = array( 'category' ); | |
return $args; | |
}); | |
} | |
/** | |
* Category page layout. | |
* | |
* @since 4.1.0 Use `get_queried_object()` to get current term. | |
* @since 4.1.8 Added new filter `ap_category_questions_args`. | |
*/ | |
public function category_page() { | |
$question_args = array( | |
'tax_query' => array( | |
array( | |
'taxonomy' => 'category', | |
'field' => 'id', | |
'terms' => array( get_queried_object_id() ), | |
), | |
), | |
); | |
$question_category = get_queried_object(); | |
if ( $question_category ) { | |
/** | |
* Filter category page question list query arguments. | |
* | |
* @param array $args Wp_Query arguments. | |
* @since 4.1.8 | |
*/ | |
$question_args = apply_filters( 'ap_category_questions_args', $question_args ); | |
anspress()->questions = ap_get_questions( $question_args ); | |
/** | |
* This action can be used to show custom message before category page. | |
* | |
* @param object $question_category Current question category. | |
* @since 1.4.2 | |
*/ | |
do_action( 'ap_before_category_page', $question_category ); | |
include ap_get_theme_location( 'addons/category/single-category.php' ); | |
} | |
} | |
/** | |
* Categories page layout | |
*/ | |
public function categories_page() { | |
global $question_categories, $ap_max_num_pages, $ap_per_page; | |
$paged = max( 1, get_query_var( 'paged' ) ); | |
$per_page = ap_opt( 'categories_per_page' ); | |
$total_terms = wp_count_terms( | |
'category', [ | |
'hide_empty' => false, | |
'parent' => 0, | |
] | |
); | |
$offset = $per_page * ( $paged - 1 ); | |
$ap_max_num_pages = ceil( $total_terms / $per_page ); | |
$order = ap_opt( 'categories_page_order' ) == 'ASC' ? 'ASC' : 'DESC'; | |
$cat_args = array( | |
'parent' => 0, | |
'number' => $per_page, | |
'offset' => $offset, | |
'hide_empty' => false, | |
'orderby' => ap_opt( 'categories_page_orderby' ), | |
'order' => $order, | |
); | |
/** | |
* Filter applied before getting categories. | |
* | |
* @param array $cat_args `get_terms` arguments. | |
* @since 1.0 | |
*/ | |
$cat_args = apply_filters( 'ap_categories_shortcode_args', $cat_args ); | |
$question_categories = get_terms( 'question_category', $cat_args ); | |
include ap_get_theme_location( 'addons/category/categories.php' ); | |
} | |
/** | |
* Register category taxonomy for question cpt. | |
* | |
* @return void | |
* @since 2.0 | |
*/ | |
public function register_question_categories() { | |
ap_add_default_options( | |
[ | |
'form_category_orderby' => 'count', | |
'categories_page_order' => 'DESC', | |
'categories_page_orderby' => 'count', | |
'category_page_slug' => 'category', | |
'categories_per_page' => 20, | |
'categories_image_height' => 150, | |
] | |
); | |
/** | |
* Labels for category taxonomy. | |
* | |
* @var array | |
*/ | |
$categories_labels = array( | |
'name' => __( 'Question Categories', 'anspress-question-answer' ), | |
'singular_name' => __( 'Category', 'anspress-question-answer' ), | |
'all_items' => __( 'All Categories', 'anspress-question-answer' ), | |
'add_new_item' => __( 'Add New Category', 'anspress-question-answer' ), | |
'edit_item' => __( 'Edit Category', 'anspress-question-answer' ), | |
'new_item' => __( 'New Category', 'anspress-question-answer' ), | |
'view_item' => __( 'View Category', 'anspress-question-answer' ), | |
'search_items' => __( 'Search Category', 'anspress-question-answer' ), | |
'not_found' => __( 'Nothing Found', 'anspress-question-answer' ), | |
'not_found_in_trash' => __( 'Nothing found in Trash', 'anspress-question-answer' ), | |
'parent_item_colon' => '', | |
); | |
/** | |
* FILTER: ap_question_category_labels | |
* Filter ic called before registering question_category taxonomy | |
*/ | |
$categories_labels = apply_filters( 'ap_question_category_labels', $categories_labels ); | |
/** | |
* Arguments for category taxonomy | |
* | |
* @var array | |
* @since 2.0 | |
*/ | |
$category_args = array( | |
'hierarchical' => true, | |
'labels' => $categories_labels, | |
'rewrite' => false, | |
'publicly_queryable' => true, | |
); | |
/** | |
* Filter is called before registering question_category taxonomy. | |
* | |
* @param array $category_args Category arguments. | |
*/ | |
$category_args = apply_filters( 'ap_question_category_args', $category_args ); | |
/** | |
* Now let WordPress know about our taxonomy | |
*/ | |
register_taxonomy( 'category', [ 'question' ], $category_args ); | |
} | |
/** | |
* Register Categories options | |
*/ | |
public function load_options() { | |
$opt = ap_opt(); | |
$form = array( | |
'fields' => array( | |
'form_category_orderby' => array( | |
'label' => __( 'Ask form category order', 'anspress-question-answer' ), | |
'description' => __( 'Set how you want to order categories in form.', 'anspress-question-answer' ), | |
'type' => 'select', | |
'options' => array( | |
'ID' => __( 'ID', 'anspress-question-answer' ), | |
'name' => __( 'Name', 'anspress-question-answer' ), | |
'slug' => __( 'Slug', 'anspress-question-answer' ), | |
'count' => __( 'Count', 'anspress-question-answer' ), | |
'term_group' => __( 'Group', 'anspress-question-answer' ), | |
), | |
'value' => $opt['form_category_orderby'], | |
), | |
'categories_page_orderby' => array( | |
'label' => __( 'Categries page order by', 'anspress-question-answer' ), | |
'description' => __( 'Set how you want to order categories in categories page.', 'anspress-question-answer' ), | |
'type' => 'select', | |
'options' => array( | |
'ID' => __( 'ID', 'anspress-question-answer' ), | |
'name' => __( 'Name', 'anspress-question-answer' ), | |
'slug' => __( 'Slug', 'anspress-question-answer' ), | |
'count' => __( 'Count', 'anspress-question-answer' ), | |
'term_group' => __( 'Group', 'anspress-question-answer' ), | |
), | |
'value' => $opt['categories_page_orderby'], | |
), | |
'categories_page_order' => array( | |
'label' => __( 'Categries page order', 'anspress-question-answer' ), | |
'description' => __( 'Set how you want to order categories in categories page.', 'anspress-question-answer' ), | |
'type' => 'select', | |
'options' => array( | |
'ASC' => __( 'Ascending', 'anspress-question-answer' ), | |
'DESC' => __( 'Descending', 'anspress-question-answer' ), | |
), | |
'value' => $opt['categories_page_order'], | |
), | |
'category_page_slug' => array( | |
'label' => __( 'Category page slug', 'anspress-question-answer' ), | |
'desc' => __( 'Slug for category page', 'anspress-question-answer' ), | |
'value' => $opt['category_page_slug'], | |
), | |
'categories_per_page' => array( | |
'label' => __( 'Category per page', 'anspress-question-answer' ), | |
'desc' => __( 'Category to show per page', 'anspress-question-answer' ), | |
'subtype' => 'number', | |
'value' => $opt['categories_per_page'], | |
), | |
'categories_image_height' => array( | |
'label' => __( 'Categories image height', 'anspress-question-answer' ), | |
'desc' => __( 'Image height in categories page', 'anspress-question-answer' ), | |
'subtype' => 'number', | |
'value' => $opt['categories_image_height'], | |
), | |
), | |
); | |
return $form; | |
} | |
/** | |
* Enqueue required script | |
*/ | |
public function admin_enqueue_scripts() { | |
if ( ! ap_load_admin_assets() ) { | |
return; | |
} | |
wp_enqueue_media(); | |
wp_enqueue_style( 'wp-color-picker' ); | |
wp_enqueue_script( 'wp-color-picker' ); | |
} | |
/** | |
* Load admin assets in categories page. | |
* | |
* @param boolean $return Return. | |
* @return boolean | |
*/ | |
public function ap_load_admin_assets( $return ) { | |
$page = get_current_screen(); | |
if ( 'category' === $page->taxonomy ) { | |
return true; | |
} | |
return $return; | |
} | |
/** | |
* Add category menu in wp-admin. | |
* | |
* @since 2.0 | |
*/ | |
public function admin_category_menu() { | |
add_submenu_page( 'anspress', __( 'Questions Category', 'anspress-question-answer' ), __( 'Category', 'anspress-question-answer' ), 'manage_options', 'edit-tags.php?taxonomy=category' ); | |
} | |
/** | |
* Append meta display. | |
* | |
* @param array $metas Display meta items. | |
* @param integer $question_id Question id. | |
* @return array | |
* @since 1.0 | |
*/ | |
public function ap_display_question_metas( $metas, $question_id ) { | |
if ( ap_post_have_terms( $question_id ) ) { | |
$metas['categories'] = ap_question_categories_html( array( 'label' => '<i class="apicon-category"></i>' ) ); | |
} | |
return $metas; | |
} | |
/** | |
* Enqueue scripts. | |
* | |
* @param array $js JavaScripts. | |
* @since 1.0 | |
*/ | |
public function ap_assets_js( $js ) { | |
if ( ap_current_page() === 'category' ) { | |
$js['main']['active'] = true; | |
} | |
return $js; | |
} | |
/** | |
* Filter category permalink. | |
* | |
* @param string $url Default taxonomy url. | |
* @param object $term WordPress term object. | |
* @param string $taxonomy Current taxonomy slug. | |
* @return string | |
*/ | |
public function term_link_filter( $url, $term, $taxonomy ) { | |
if ( 'category' === $taxonomy ) { | |
if ( get_option( 'permalink_structure' ) != '' ) { | |
$opt = get_option( 'ap_categories_path', 'categories' ); | |
return home_url( $opt ) . '/' . $term->slug . '/'; | |
} else { | |
return add_query_arg( | |
[ | |
'ap_page' => 'category', | |
'category' => $term->slug, | |
], home_url() | |
); | |
} | |
} | |
return $url; | |
} | |
/** | |
* Add category field in ask form. | |
* | |
* @param array $args Ask form arguments. | |
* @return array | |
* @since 4.1.0 | |
*/ | |
public function ap_question_form_fields( $form ) { | |
if ( wp_count_terms( 'category' ) == 0 ) { // WPCS: loose comparison okay. | |
return $form; | |
} | |
$editing_id = ap_sanitize_unslash( 'id', 'r' ); | |
$form['fields']['category'] = array( | |
'label' => __( 'Category', 'anspress-question-answer' ), | |
'desc' => __( 'Select a topic that best fits your question.', 'anspress-question-answer' ), | |
'type' => 'select', | |
'options' => 'terms', | |
'order' => 2, | |
'validate' => 'required,not_zero', | |
); | |
// Add value when editing post. | |
if ( ! empty( $editing_id ) ) { | |
$categories = get_the_terms( $editing_id, 'category' ); | |
if ( $categories ) { | |
$form['fields']['category']['value'] = $categories[0]->term_id; | |
} | |
} | |
return $form; | |
} | |
/** | |
* Things to do after creating a question. | |
* | |
* @param integer $post_id Questions ID. | |
* @param object $post Question post object. | |
* @return void | |
* @since 1.0 | |
*/ | |
public function after_new_question( $post_id, $post ) { | |
$values = anspress()->get_form( 'question' )->get_values(); | |
if ( isset( $values['category']['value'] ) ) { | |
wp_set_post_terms( $post_id, $values['category']['value'], 'category' ); | |
} | |
} | |
/** | |
* Add category page title. | |
* | |
* @param string $title AnsPress page title. | |
* @return string | |
* @deprecated 4.1.1 | |
*/ | |
public function page_title( $title ) { | |
if ( is_question_categories() ) { | |
$title = ap_opt( 'categories_page_title' ); | |
} elseif ( is_question_category() ) { | |
$category = get_queried_object(); | |
if ( $category ) { | |
$title = $category->name; | |
} else { | |
$title = __( 'No matching category found', 'anspress-question-answer' ); | |
} | |
} | |
return $title; | |
} | |
/** | |
* Add category nav in AnsPress breadcrumbs. | |
* | |
* @param array $navs Breadcrumbs nav array. | |
* @return array | |
*/ | |
public function ap_breadcrumbs( $navs ) { | |
if ( is_question() && taxonomy_exists( 'category' ) ) { | |
$cats = get_the_terms( get_question_id(), 'category' ); | |
if ( $cats ) { | |
$navs['category'] = array( 'title' => $cats[0]->name, 'link' => get_term_link( $cats[0], 'category' ), 'order' => 2 ); //@codingStandardsIgnoreLine | |
} | |
} elseif ( is_question_category() ) { | |
$category = get_queried_object(); | |
$navs['page'] = array( | |
'title' => __( 'Categories', 'anspress-question-answer' ), | |
'link' => ap_get_link_to( 'categories' ), | |
'order' => 8, | |
); | |
$navs['category'] = array( | |
'title' => $category->name, | |
'link' => get_term_link( $category, 'category' ), | |
'order' => 8, | |
); | |
} elseif ( is_question_categories() ) { | |
$navs['page'] = array( | |
'title' => __( 'Categories', 'anspress-question-answer' ), | |
'link' => ap_get_link_to( 'categories' ), | |
'order' => 8, | |
); | |
} | |
return $navs; | |
} | |
/** | |
* Modify term clauses. | |
* | |
* @param array $pieces MySql query parts. | |
* @param array $taxonomies Taxonomies. | |
* @param array $args Args. | |
*/ | |
public function terms_clauses( $pieces, $taxonomies, $args ) { | |
if ( ! in_array( 'category', $taxonomies, true ) || ! isset( $args['ap_query'] ) || 'subscription' !== $args['ap_query'] ) { | |
return $pieces; | |
} | |
global $wpdb; | |
$pieces['join'] = $pieces['join'] . ' INNER JOIN ' . $wpdb->prefix . 'ap_meta apmeta ON t.term_id = apmeta.apmeta_actionid'; | |
$pieces['where'] = $pieces['where'] . " AND apmeta.apmeta_type='subscriber' AND apmeta.apmeta_param='category' AND apmeta.apmeta_userid='" . $args['user_id'] . "'"; | |
return $pieces; | |
} | |
/** | |
* Add category sorting in list filters. | |
* | |
* @param array $filters Filters. | |
* @return array | |
*/ | |
public function ap_list_filters( $filters ) { | |
global $wp; | |
if ( ! isset( $wp->query_vars['ap_categories'] ) && ! is_question_category() ) { | |
$filters['category'] = array( | |
'title' => __( 'Category', 'anspress-question-answer' ), | |
'items' => [], | |
'search' => true, | |
'multiple' => true, | |
); | |
} | |
return $filters; | |
} | |
/** | |
* Custom question category fields. | |
* | |
* @param array $term Term. | |
* @return void | |
*/ | |
public function image_field_new( $term ) { | |
?> | |
<div class='form-field term-image-wrap'> | |
<label for='ap_image'><?php esc_attr_e( 'Image', 'anspress-question-answer' ); ?></label> | |
<a href="#" id="ap-category-upload" class="button" data-action="ap_media_uplaod" data-title="<?php esc_attr_e( 'Upload image', 'anspress-question-answer' ); ?>" data-urlc="#ap_category_media_url" data-idc="#ap_category_media_id"><?php esc_attr_e( 'Upload image', 'anspress-question-answer' ); ?></a> | |
<input id="ap_category_media_url" type="hidden" name="ap_category_image_url" value=""> | |
<input id="ap_category_media_id" type="hidden" name="ap_category_image_id" value=""> | |
<p class="description"><?php esc_attr_e( 'Category image', 'anspress-question-answer' ); ?></p> | |
</div> | |
<div class='form-field term-image-wrap'> | |
<label for='ap_icon'><?php esc_attr_e( 'Category icon class', 'anspress-question-answer' ); ?></label> | |
<input id="ap_icon" type="text" name="ap_icon" value=""> | |
<p class="description"><?php esc_attr_e( 'Font icon class, if image not set', 'anspress-question-answer' ); ?></p> | |
</div> | |
<div class='form-field term-image-wrap'> | |
<label for='ap-category-color'><?php esc_attr_e( 'Icon background color', 'anspress-question-answer' ); ?></label> | |
<input id="ap-category-color" type="text" name="ap_color" value=""> | |
<p class="description"><?php esc_attr_e( 'Set background color to be used with icon', 'anspress-question-answer' ); ?></p> | |
<script type="text/javascript"> | |
jQuery(document).ready(function(){ | |
jQuery('#ap-category-color').wpColorPicker(); | |
}); | |
</script> | |
</div> | |
<?php | |
} | |
/** | |
* Image field in category form. | |
* | |
* @param object $term Term. | |
*/ | |
public function image_field_edit( $term ) { | |
$term_meta = get_term_meta( $term->term_id, 'ap_category', true ); | |
$term_meta = wp_parse_args( | |
$term_meta, array( | |
'image' => [ | |
'id' => '', | |
'url' => '', | |
], | |
'icon' => '', | |
'color' => '', | |
) | |
); | |
?> | |
<tr class='form-field form-required term-name-wrap'> | |
<th scope='row'> | |
<label for='custom-field'><?php esc_attr_e( 'Image', 'anspress-question-answer' ); ?></label> | |
</th> | |
<td> | |
<a href="#" id="ap-category-upload" class="button" data-action="ap_media_uplaod" data-title="<?php esc_attr_e( 'Upload image', 'anspress-question-answer' ); ?>" data-idc="#ap_category_media_id" data-urlc="#ap_category_media_url"><?php esc_attr_e( 'Upload image', 'anspress-question-answer' ); ?></a> | |
<?php if ( ! empty( $term_meta['image'] ) && ! empty( $term_meta['image']['url'] ) ) { ?> | |
<img id="ap_category_media_preview" data-action="ap_media_value" src="<?php echo esc_url( $term_meta['image']['url'] ); ?>" /> | |
<?php } ?> | |
<input id="ap_category_media_url" type="hidden" data-action="ap_media_value" name="ap_category_image_url" value="<?php echo esc_url( $term_meta['image']['url'] ); ?>"> | |
<input id="ap_category_media_id" type="hidden" data-action="ap_media_value" name="ap_category_image_id" value="<?php echo esc_attr( $term_meta['image']['id'] ); ?>"> | |
<a href="#" id="ap-category-upload-remove" data-action="ap_media_remove"><?php esc_attr_e( 'Remove image', 'anspress-question-answer' ); ?></a> | |
<p class='description'><?php esc_attr_e( 'Featured image for category', 'anspress-question-answer' ); ?></p> | |
</td> | |
</tr> | |
<tr class='form-field term-name-wrap'> | |
<th scope='row'> | |
<label for='custom-field'><?php esc_attr_e( 'Category icon class', 'anspress-question-answer' ); ?></label> | |
</th> | |
<td> | |
<input id="ap_icon" type="text" name="ap_icon" value="<?php echo esc_attr( $term_meta['icon'] ); ?>"> | |
<p class="description"><?php esc_attr_e( 'Font icon class, if image not set', 'anspress-question-answer' ); ?></p> | |
</td> | |
</tr> | |
<tr class='form-field term-name-wrap'> | |
<th scope='row'> | |
<label for='ap-category-color'><?php esc_attr_e( 'Category icon color', 'anspress-question-answer' ); ?></label> | |
</th> | |
<td> | |
<input id="ap-category-color" type="text" name="ap_color" value="<?php echo esc_attr( $term_meta['color'] ); ?>"> | |
<p class="description"><?php esc_attr_e( 'Font icon class, if image not set', 'anspress-question-answer' ); ?></p> | |
<script type="text/javascript"> | |
jQuery(document).ready(function(){ | |
jQuery('#ap-category-color').wpColorPicker(); | |
}); | |
</script> | |
</td> | |
</tr> | |
<?php | |
} | |
/** | |
* Process and save category images. | |
* | |
* @param integer $term_id Term id. | |
*/ | |
public function save_image_field( $term_id ) { | |
$image_url = ap_isset_post_value( 'ap_category_image_url', '' ); | |
$image_id = ap_isset_post_value( 'ap_category_image_id', '' ); | |
$icon = ap_isset_post_value( 'ap_icon', '' ); | |
$color = ap_isset_post_value( 'ap_color', '' ); | |
if ( current_user_can( 'manage_categories' ) ) { | |
// Get options from database - if not a array create a new one. | |
$term_meta = get_term_meta( $term_id, 'ap_category', true ); | |
if ( ! is_array( $term_meta ) ) { | |
$term_meta = [ 'image' => [] ]; | |
} | |
if ( ! is_array( $term_meta['image'] ) ) { | |
$term_meta['image'] = []; | |
} | |
// Image url. | |
if ( ! empty( $image_url ) ) { | |
$term_meta['image']['url'] = esc_url( $image_url ); | |
} else { | |
unset( $term_meta['image']['url'] ); | |
} | |
// Image id. | |
if ( ! empty( $image_id ) ) { | |
$term_meta['image']['id'] = (int) $image_id; | |
} else { | |
unset( $term_meta['image']['id'] ); | |
} | |
// Category icon. | |
if ( ! empty( $icon ) ) { | |
$term_meta['icon'] = sanitize_text_field( $icon ); | |
} else { | |
unset( $term_meta['icon'] ); | |
} | |
// Category color. | |
if ( ! empty( $color ) ) { | |
$term_meta['color'] = sanitize_text_field( $color ); | |
} else { | |
unset( $term_meta['color'] ); | |
} | |
if ( empty( $term_meta['image'] ) ) { | |
unset( $term_meta['image'] ); | |
} | |
// Delete meta if empty. | |
if ( empty( $term_meta ) ) { | |
delete_term_meta( $term_id, 'ap_category' ); | |
} else { | |
update_term_meta( $term_id, 'ap_category', $term_meta ); | |
} | |
} // End if(). | |
} | |
/** | |
* Add category pages rewrite rule. | |
* | |
* @param array $rules AnsPress rules. | |
* @param string $slug Slug. | |
* @param integer $base_page_id Base page ID. | |
* @return array | |
* @since unknown | |
* @since 4.1.6 Fixed: category pagination. | |
*/ | |
public function rewrite_rules( $rules, $slug, $base_page_id ) { | |
$base_slug = get_page_uri( ap_opt( 'categories_page' ) ); | |
update_option( 'ap_categories_path', $base_slug, true ); | |
$cat_rules = array( | |
$base_slug . '/([^/]+)/page/?([0-9]{1,})/?$' => 'index.php?category=$matches[#]&paged=$matches[#]&ap_page=category', | |
$base_slug . '/([^/]+)/?$' => 'index.php?category=$matches[#]&ap_page=category', | |
); | |
return $cat_rules + $rules; | |
} | |
/** | |
* Filter main questions query args. Modify and add category args. | |
* | |
* @param array $args Questions args. | |
* @return array | |
*/ | |
public function ap_main_questions_args( $args ) { | |
global $wp; | |
$query = $wp->query_vars; | |
$categories_operator = ! empty( $wp->query_vars['ap_categories_operator'] ) ? $wp->query_vars['ap_categories_operator'] : 'IN'; | |
$current_filter = ap_get_current_list_filters( 'category' ); | |
if ( isset( $query['ap_categories'] ) && is_array( $query['ap_categories'] ) ) { | |
$args['tax_query'][] = array( | |
'taxonomy' => 'category', | |
'field' => 'slug', | |
'terms' => $query['ap_categories'], | |
'operator' => $categories_operator, | |
); | |
} elseif ( ! empty( $current_filter ) ) { | |
$args['tax_query'][] = array( | |
'taxonomy' => 'category', | |
'field' => 'term_id', | |
'terms' => explode( ',', sanitize_comma_delimited( $current_filter ) ), | |
); | |
} | |
return $args; | |
} | |
/** | |
* Subscriber action ID. | |
* | |
* @param integer $action_id Current action ID. | |
* @return integer | |
*/ | |
public function subscribers_action_id( $action_id ) { | |
if ( is_question_category() ) { | |
global $question_category; | |
$action_id = $question_category->term_id; | |
} | |
return $action_id; | |
} | |
/** | |
* Filter ask button link to append current category link. | |
* | |
* @param string $link Ask button link. | |
* @return string | |
*/ | |
public function ap_ask_btn_link( $link ) { | |
if ( is_question_category() ) { | |
$question_category = get_queried_object(); | |
return $link . '?category=' . $question_category->term_id; | |
} | |
return $link; | |
} | |
/** | |
* Filter canonical URL when in category page. | |
* | |
* @param string $canonical_url url. | |
* @return string | |
* @deprecated 4.1.1 | |
*/ | |
public function ap_canonical_url( $canonical_url ) { | |
if ( is_question_category() ) { | |
global $question_category; | |
if ( ! $question_category ) { | |
$question_category = get_queried_object(); | |
} | |
return get_term_link( $question_category ); // @codingStandardsIgnoreLine. | |
} | |
return $canonical_url; | |
} | |
/** | |
* Category feed link in head. | |
*/ | |
public function category_feed() { | |
if ( is_question_category() ) { | |
$question_category = get_queried_object(); | |
echo '<link href="' . esc_url( home_url( 'feed' ) ) . '?post_type=question&category=' . esc_url( $question_category->slug ) . '" title="' . esc_attr__( 'Question category feed', 'anspress-question-answer' ) . '" type="application/rss+xml" rel="alternate">'; | |
} | |
} | |
/** | |
* Ajax callback for loading order by filter. | |
* | |
* @since 4.0.0 | |
*/ | |
public function load_filter_category() { | |
$filter = ap_sanitize_unslash( 'filter', 'r' ); | |
check_ajax_referer( 'filter_' . $filter, '__nonce' ); | |
$search = (string) ap_sanitize_unslash( 'search', 'r', false ); | |
ap_ajax_json( | |
array( | |
'success' => true, | |
'items' => ap_get_category_filter( $search ), | |
'multiple' => true, | |
'nonce' => wp_create_nonce( 'filter_' . $filter ), | |
) | |
); | |
} | |
/** | |
* Output active category in filter | |
* | |
* @since 4.0.0 | |
*/ | |
public function filter_active_category( $active, $filter ) { | |
$current_filters = ap_get_current_list_filters( 'category' ); | |
if ( ! empty( $current_filters ) ) { | |
$args = array( | |
'hierarchical' => true, | |
'hide_if_empty' => true, | |
'number' => 2, | |
'include' => $current_filters, | |
); | |
$terms = get_terms( 'category', $args ); | |
if ( $terms ) { | |
$active_terms = []; | |
foreach ( (array) $terms as $t ) { | |
$active_terms[] = $t->name; | |
} | |
$count = count( $current_filters ); | |
$more_label = sprintf( __( ', %d+', 'anspress-question-answer' ), $count - 2 ); | |
return ': <span class="ap-filter-active">' . implode( ', ', $active_terms ) . ( $count > 2 ? $more_label : '' ) . '</span>'; | |
} | |
} | |
} | |
/** | |
* Column header. | |
* | |
* @param array $columns Category columns. | |
* @return array | |
*/ | |
public function column_header( $columns ) { | |
$columns['icon'] = 'Icon'; | |
return $columns; | |
} | |
/** | |
* Icon column content. | |
*/ | |
public function column_content( $value, $column_name, $tax_id ) { | |
if ( 'icon' === $column_name ) { | |
ap_category_icon( $tax_id ); | |
} | |
} | |
/** | |
* Modify current page to show category archive. | |
* | |
* @param string $query_var Current page. | |
* @return string | |
* @since 4.1.0 | |
*/ | |
public function ap_current_page( $query_var ) { | |
if ( 'categories' === $query_var && 'category' === get_query_var( 'ap_page' ) ) { | |
return 'category'; | |
} | |
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 | |
*/ | |
public function modify_query_category_archive( $posts, $query ) { | |
if ( $query->is_main_query() && $query->is_tax( 'category' ) && 'category' === get_query_var( 'ap_page' ) ) { | |
$query->found_posts = 1; | |
$query->max_num_pages = 1; | |
$page = get_page( ap_opt( 'categories_page' ) ); | |
$page->post_title = get_queried_object()->name; | |
$posts = [ $page ]; | |
} | |
return $posts; | |
} | |
/** | |
* Include required files. | |
* | |
* @since 4.1.8 | |
*/ | |
public function widget() { | |
require_once ANSPRESS_ADDONS_DIR . '/wpcategories/widget.php'; | |
register_widget( 'Anspress\Widgets\WPCategories' ); | |
} | |
} | |
// Init addon. | |
Categories::init(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Add category support in AnsPress questions. | |
* | |
* @author Rahul Aryan <support@anspress.io> | |
* @copyright 2014 AnsPress.io & Rahul Aryan | |
* @license GPL-3.0+ https://www.gnu.org/licenses/gpl-3.0.txt | |
* @link https://anspress.io | |
* @package AnsPress | |
* @subpackage Categories Addon | |
* @since 4.1.8 | |
*/ | |
namespace AnsPress\Addons; | |
// If this file is called directly, abort. | |
if ( ! defined( 'WPINC' ) ) { | |
die; | |
} | |
/** | |
* Categories addon class. | |
*/ | |
class Categories extends \AnsPress\Singleton { | |
/** | |
* Refers to a single instance of this class. | |
* | |
* @var null|object | |
* @since 4.1.8 | |
*/ | |
public static $instance = null; | |
/** | |
* Initialize the class. | |
* | |
* @since 4.0.0 | |
*/ | |
protected function __construct() { | |
ap_register_page( 'category', __( 'Category', 'anspress-question-answer' ), array( $this, 'category_page' ), false ); | |
ap_register_page( 'categories', __( 'Categories', 'anspress-question-answer' ), array( $this, 'categories_page' ) ); | |
anspress()->add_action( 'init', $this, 'register_question_categories', 1 ); | |
anspress()->add_action( 'ap_form_addon-categories', $this, 'load_options' ); | |
anspress()->add_action( 'admin_enqueue_scripts', $this, 'admin_enqueue_scripts' ); | |
anspress()->add_action( 'ap_load_admin_assets', $this, 'ap_load_admin_assets' ); | |
anspress()->add_action( 'ap_admin_menu', $this, 'admin_category_menu' ); | |
anspress()->add_action( 'ap_display_question_metas', $this, 'ap_display_question_metas', 10, 2 ); | |
anspress()->add_action( 'ap_assets_js', $this, 'ap_assets_js' ); | |
anspress()->add_filter( 'term_link', $this, 'term_link_filter', 10, 3 ); | |
anspress()->add_action( 'ap_question_form_fields', $this, 'ap_question_form_fields' ); | |
anspress()->add_action( 'save_post_question', $this, 'after_new_question', 0, 2 ); | |
anspress()->add_filter( 'ap_breadcrumbs', $this, 'ap_breadcrumbs' ); | |
anspress()->add_action( 'terms_clauses', $this, 'terms_clauses', 10, 3 ); | |
anspress()->add_filter( 'ap_list_filters', $this, 'ap_list_filters' ); | |
anspress()->add_action( 'question_category_add_form_fields', $this, 'image_field_new' ); | |
anspress()->add_action( 'question_category_edit_form_fields', $this, 'image_field_edit' ); | |
anspress()->add_action( 'create_question_category', $this, 'save_image_field' ); | |
anspress()->add_action( 'edited_question_category', $this, 'save_image_field' ); | |
anspress()->add_action( 'ap_rewrites', $this, 'rewrite_rules', 10, 3 ); | |
anspress()->add_filter( 'ap_main_questions_args', $this, 'ap_main_questions_args' ); | |
anspress()->add_filter( 'ap_question_subscribers_action_id', $this, 'subscribers_action_id' ); | |
anspress()->add_filter( 'ap_ask_btn_link', $this, 'ap_ask_btn_link' ); | |
// anspress()->add_filter( 'ap_canonical_url', $this, 'ap_canonical_url' ); | |
anspress()->add_filter( 'wp_head', $this, 'category_feed' ); | |
anspress()->add_filter( 'manage_edit-question_category_columns', $this, 'column_header' ); | |
anspress()->add_filter( 'manage_question_category_custom_column', $this, 'column_content', 10, 3 ); | |
anspress()->add_filter( 'ap_current_page', $this, 'ap_current_page' ); | |
anspress()->add_action( 'posts_pre_query', $this, 'modify_query_category_archive', 9999, 2 ); | |
// List filtering. | |
anspress()->add_action( 'ap_ajax_load_filter_category', $this, 'load_filter_category' ); | |
anspress()->add_filter( 'ap_list_filter_active_category', $this, 'filter_active_category', 10, 2 ); | |
anspress()->add_action( 'widgets_init', $this, 'widget' ); | |
} | |
/** | |
* Category page layout. | |
* | |
* @since 4.1.0 Use `get_queried_object()` to get current term. | |
* @since 4.1.8 Added new filter `ap_category_questions_args`. | |
*/ | |
public function category_page() { | |
$question_args = array( | |
'tax_query' => array( | |
array( | |
'taxonomy' => 'question_category', | |
'field' => 'id', | |
'terms' => array( get_queried_object_id() ), | |
), | |
), | |
); | |
$question_category = get_queried_object(); | |
if ( $question_category ) { | |
/** | |
* Filter category page question list query arguments. | |
* | |
* @param array $args Wp_Query arguments. | |
* @since 4.1.8 | |
*/ | |
$question_args = apply_filters( 'ap_category_questions_args', $question_args ); | |
anspress()->questions = ap_get_questions( $question_args ); | |
/** | |
* This action can be used to show custom message before category page. | |
* | |
* @param object $question_category Current question category. | |
* @since 1.4.2 | |
*/ | |
do_action( 'ap_before_category_page', $question_category ); | |
include ap_get_theme_location( 'addons/category/single-category.php' ); | |
} | |
} | |
/** | |
* Categories page layout | |
*/ | |
public function categories_page() { | |
global $question_categories, $ap_max_num_pages, $ap_per_page; | |
$paged = max( 1, get_query_var( 'paged' ) ); | |
$per_page = ap_opt( 'categories_per_page' ); | |
$total_terms = wp_count_terms( | |
'question_category', [ | |
'hide_empty' => false, | |
'parent' => 0, | |
] | |
); | |
$offset = $per_page * ( $paged - 1 ); | |
$ap_max_num_pages = ceil( $total_terms / $per_page ); | |
$order = ap_opt( 'categories_page_order' ) == 'ASC' ? 'ASC' : 'DESC'; | |
$cat_args = array( | |
'parent' => 0, | |
'number' => $per_page, | |
'offset' => $offset, | |
'hide_empty' => false, | |
'orderby' => ap_opt( 'categories_page_orderby' ), | |
'order' => $order, | |
); | |
/** | |
* Filter applied before getting categories. | |
* | |
* @param array $cat_args `get_terms` arguments. | |
* @since 1.0 | |
*/ | |
$cat_args = apply_filters( 'ap_categories_shortcode_args', $cat_args ); | |
$question_categories = get_terms( 'question_category', $cat_args ); | |
include ap_get_theme_location( 'addons/category/categories.php' ); | |
} | |
/** | |
* Register category taxonomy for question cpt. | |
* | |
* @return void | |
* @since 2.0 | |
*/ | |
public function register_question_categories() { | |
ap_add_default_options( | |
[ | |
'form_category_orderby' => 'count', | |
'categories_page_order' => 'DESC', | |
'categories_page_orderby' => 'count', | |
'category_page_slug' => 'category', | |
'categories_per_page' => 20, | |
'categories_image_height' => 150, | |
] | |
); | |
/** | |
* Labels for category taxonomy. | |
* | |
* @var array | |
*/ | |
$categories_labels = array( | |
'name' => __( 'Question Categories', 'anspress-question-answer' ), | |
'singular_name' => __( 'Category', 'anspress-question-answer' ), | |
'all_items' => __( 'All Categories', 'anspress-question-answer' ), | |
'add_new_item' => __( 'Add New Category', 'anspress-question-answer' ), | |
'edit_item' => __( 'Edit Category', 'anspress-question-answer' ), | |
'new_item' => __( 'New Category', 'anspress-question-answer' ), | |
'view_item' => __( 'View Category', 'anspress-question-answer' ), | |
'search_items' => __( 'Search Category', 'anspress-question-answer' ), | |
'not_found' => __( 'Nothing Found', 'anspress-question-answer' ), | |
'not_found_in_trash' => __( 'Nothing found in Trash', 'anspress-question-answer' ), | |
'parent_item_colon' => '', | |
); | |
/** | |
* FILTER: ap_question_category_labels | |
* Filter ic called before registering question_category taxonomy | |
*/ | |
$categories_labels = apply_filters( 'ap_question_category_labels', $categories_labels ); | |
/** | |
* Arguments for category taxonomy | |
* | |
* @var array | |
* @since 2.0 | |
*/ | |
$category_args = array( | |
'hierarchical' => true, | |
'labels' => $categories_labels, | |
'rewrite' => false, | |
'publicly_queryable' => true, | |
); | |
/** | |
* Filter is called before registering question_category taxonomy. | |
* | |
* @param array $category_args Category arguments. | |
*/ | |
$category_args = apply_filters( 'ap_question_category_args', $category_args ); | |
/** | |
* Now let WordPress know about our taxonomy | |
*/ | |
register_taxonomy( 'question_category', [ 'question' ], $category_args ); | |
} | |
/** | |
* Register Categories options | |
*/ | |
public function load_options() { | |
$opt = ap_opt(); | |
$form = array( | |
'fields' => array( | |
'form_category_orderby' => array( | |
'label' => __( 'Ask form category order', 'anspress-question-answer' ), | |
'description' => __( 'Set how you want to order categories in form.', 'anspress-question-answer' ), | |
'type' => 'select', | |
'options' => array( | |
'ID' => __( 'ID', 'anspress-question-answer' ), | |
'name' => __( 'Name', 'anspress-question-answer' ), | |
'slug' => __( 'Slug', 'anspress-question-answer' ), | |
'count' => __( 'Count', 'anspress-question-answer' ), | |
'term_group' => __( 'Group', 'anspress-question-answer' ), | |
), | |
'value' => $opt['form_category_orderby'], | |
), | |
'categories_page_orderby' => array( | |
'label' => __( 'Categries page order by', 'anspress-question-answer' ), | |
'description' => __( 'Set how you want to order categories in categories page.', 'anspress-question-answer' ), | |
'type' => 'select', | |
'options' => array( | |
'ID' => __( 'ID', 'anspress-question-answer' ), | |
'name' => __( 'Name', 'anspress-question-answer' ), | |
'slug' => __( 'Slug', 'anspress-question-answer' ), | |
'count' => __( 'Count', 'anspress-question-answer' ), | |
'term_group' => __( 'Group', 'anspress-question-answer' ), | |
), | |
'value' => $opt['categories_page_orderby'], | |
), | |
'categories_page_order' => array( | |
'label' => __( 'Categries page order', 'anspress-question-answer' ), | |
'description' => __( 'Set how you want to order categories in categories page.', 'anspress-question-answer' ), | |
'type' => 'select', | |
'options' => array( | |
'ASC' => __( 'Ascending', 'anspress-question-answer' ), | |
'DESC' => __( 'Descending', 'anspress-question-answer' ), | |
), | |
'value' => $opt['categories_page_order'], | |
), | |
'category_page_slug' => array( | |
'label' => __( 'Category page slug', 'anspress-question-answer' ), | |
'desc' => __( 'Slug for category page', 'anspress-question-answer' ), | |
'value' => $opt['category_page_slug'], | |
), | |
'categories_per_page' => array( | |
'label' => __( 'Category per page', 'anspress-question-answer' ), | |
'desc' => __( 'Category to show per page', 'anspress-question-answer' ), | |
'subtype' => 'number', | |
'value' => $opt['categories_per_page'], | |
), | |
'categories_image_height' => array( | |
'label' => __( 'Categories image height', 'anspress-question-answer' ), | |
'desc' => __( 'Image height in categories page', 'anspress-question-answer' ), | |
'subtype' => 'number', | |
'value' => $opt['categories_image_height'], | |
), | |
), | |
); | |
return $form; | |
} | |
/** | |
* Enqueue required script | |
*/ | |
public function admin_enqueue_scripts() { | |
if ( ! ap_load_admin_assets() ) { | |
return; | |
} | |
wp_enqueue_media(); | |
wp_enqueue_style( 'wp-color-picker' ); | |
wp_enqueue_script( 'wp-color-picker' ); | |
} | |
/** | |
* Load admin assets in categories page. | |
* | |
* @param boolean $return Return. | |
* @return boolean | |
*/ | |
public function ap_load_admin_assets( $return ) { | |
$page = get_current_screen(); | |
if ( 'question_category' === $page->taxonomy ) { | |
return true; | |
} | |
return $return; | |
} | |
/** | |
* Add category menu in wp-admin. | |
* | |
* @since 2.0 | |
*/ | |
public function admin_category_menu() { | |
add_submenu_page( 'anspress', __( 'Questions Category', 'anspress-question-answer' ), __( 'Category', 'anspress-question-answer' ), 'manage_options', 'edit-tags.php?taxonomy=question_category' ); | |
} | |
/** | |
* Append meta display. | |
* | |
* @param array $metas Display meta items. | |
* @param integer $question_id Question id. | |
* @return array | |
* @since 1.0 | |
*/ | |
public function ap_display_question_metas( $metas, $question_id ) { | |
if ( ap_post_have_terms( $question_id ) ) { | |
$metas['categories'] = ap_question_categories_html( array( 'label' => '<i class="apicon-category"></i>' ) ); | |
} | |
return $metas; | |
} | |
/** | |
* Enqueue scripts. | |
* | |
* @param array $js JavaScripts. | |
* @since 1.0 | |
*/ | |
public function ap_assets_js( $js ) { | |
if ( ap_current_page() === 'category' ) { | |
$js['main']['active'] = true; | |
} | |
return $js; | |
} | |
/** | |
* Filter category permalink. | |
* | |
* @param string $url Default taxonomy url. | |
* @param object $term WordPress term object. | |
* @param string $taxonomy Current taxonomy slug. | |
* @return string | |
*/ | |
public function term_link_filter( $url, $term, $taxonomy ) { | |
if ( 'question_category' === $taxonomy ) { | |
if ( get_option( 'permalink_structure' ) != '' ) { | |
$opt = get_option( 'ap_categories_path', 'categories' ); | |
return home_url( $opt ) . '/' . $term->slug . '/'; | |
} else { | |
return add_query_arg( | |
[ | |
'ap_page' => 'category', | |
'question_category' => $term->slug, | |
], home_url() | |
); | |
} | |
} | |
return $url; | |
} | |
/** | |
* Add category field in ask form. | |
* | |
* @param array $args Ask form arguments. | |
* @return array | |
* @since 4.1.0 | |
*/ | |
public function ap_question_form_fields( $form ) { | |
if ( wp_count_terms( 'question_category' ) == 0 ) { // WPCS: loose comparison okay. | |
return $form; | |
} | |
$editing_id = ap_sanitize_unslash( 'id', 'r' ); | |
$form['fields']['category'] = array( | |
'label' => __( 'Category', 'anspress-question-answer' ), | |
'desc' => __( 'Select a topic that best fits your question.', 'anspress-question-answer' ), | |
'type' => 'select', | |
'options' => 'terms', | |
'order' => 2, | |
'validate' => 'required,not_zero', | |
); | |
// Add value when editing post. | |
if ( ! empty( $editing_id ) ) { | |
$categories = get_the_terms( $editing_id, 'question_category' ); | |
if ( $categories ) { | |
$form['fields']['category']['value'] = $categories[0]->term_id; | |
} | |
} | |
return $form; | |
} | |
/** | |
* Things to do after creating a question. | |
* | |
* @param integer $post_id Questions ID. | |
* @param object $post Question post object. | |
* @return void | |
* @since 1.0 | |
*/ | |
public function after_new_question( $post_id, $post ) { | |
$values = anspress()->get_form( 'question' )->get_values(); | |
if ( isset( $values['category']['value'] ) ) { | |
wp_set_post_terms( $post_id, $values['category']['value'], 'question_category' ); | |
} | |
} | |
/** | |
* Add category page title. | |
* | |
* @param string $title AnsPress page title. | |
* @return string | |
* @deprecated 4.1.1 | |
*/ | |
public function page_title( $title ) { | |
if ( is_question_categories() ) { | |
$title = ap_opt( 'categories_page_title' ); | |
} elseif ( is_question_category() ) { | |
$category = get_queried_object(); | |
if ( $category ) { | |
$title = $category->name; | |
} else { | |
$title = __( 'No matching category found', 'anspress-question-answer' ); | |
} | |
} | |
return $title; | |
} | |
/** | |
* Add category nav in AnsPress breadcrumbs. | |
* | |
* @param array $navs Breadcrumbs nav array. | |
* @return array | |
*/ | |
public function ap_breadcrumbs( $navs ) { | |
if ( is_question() && taxonomy_exists( 'question_category' ) ) { | |
$cats = get_the_terms( get_question_id(), 'question_category' ); | |
if ( $cats ) { | |
$navs['category'] = array( 'title' => $cats[0]->name, 'link' => get_term_link( $cats[0], 'question_category' ), 'order' => 2 ); //@codingStandardsIgnoreLine | |
} | |
} elseif ( is_question_category() ) { | |
$category = get_queried_object(); | |
$navs['page'] = array( | |
'title' => __( 'Categories', 'anspress-question-answer' ), | |
'link' => ap_get_link_to( 'categories' ), | |
'order' => 8, | |
); | |
$navs['category'] = array( | |
'title' => $category->name, | |
'link' => get_term_link( $category, 'question_category' ), | |
'order' => 8, | |
); | |
} elseif ( is_question_categories() ) { | |
$navs['page'] = array( | |
'title' => __( 'Categories', 'anspress-question-answer' ), | |
'link' => ap_get_link_to( 'categories' ), | |
'order' => 8, | |
); | |
} | |
return $navs; | |
} | |
/** | |
* Modify term clauses. | |
* | |
* @param array $pieces MySql query parts. | |
* @param array $taxonomies Taxonomies. | |
* @param array $args Args. | |
*/ | |
public function terms_clauses( $pieces, $taxonomies, $args ) { | |
if ( ! in_array( 'question_category', $taxonomies, true ) || ! isset( $args['ap_query'] ) || 'subscription' !== $args['ap_query'] ) { | |
return $pieces; | |
} | |
global $wpdb; | |
$pieces['join'] = $pieces['join'] . ' INNER JOIN ' . $wpdb->prefix . 'ap_meta apmeta ON t.term_id = apmeta.apmeta_actionid'; | |
$pieces['where'] = $pieces['where'] . " AND apmeta.apmeta_type='subscriber' AND apmeta.apmeta_param='category' AND apmeta.apmeta_userid='" . $args['user_id'] . "'"; | |
return $pieces; | |
} | |
/** | |
* Add category sorting in list filters. | |
* | |
* @param array $filters Filters. | |
* @return array | |
*/ | |
public function ap_list_filters( $filters ) { | |
global $wp; | |
if ( ! isset( $wp->query_vars['ap_categories'] ) && ! is_question_category() ) { | |
$filters['category'] = array( | |
'title' => __( 'Category', 'anspress-question-answer' ), | |
'items' => [], | |
'search' => true, | |
'multiple' => true, | |
); | |
} | |
return $filters; | |
} | |
/** | |
* Custom question category fields. | |
* | |
* @param array $term Term. | |
* @return void | |
*/ | |
public function image_field_new( $term ) { | |
?> | |
<div class='form-field term-image-wrap'> | |
<label for='ap_image'><?php esc_attr_e( 'Image', 'anspress-question-answer' ); ?></label> | |
<a href="#" id="ap-category-upload" class="button" data-action="ap_media_uplaod" data-title="<?php esc_attr_e( 'Upload image', 'anspress-question-answer' ); ?>" data-urlc="#ap_category_media_url" data-idc="#ap_category_media_id"><?php esc_attr_e( 'Upload image', 'anspress-question-answer' ); ?></a> | |
<input id="ap_category_media_url" type="hidden" name="ap_category_image_url" value=""> | |
<input id="ap_category_media_id" type="hidden" name="ap_category_image_id" value=""> | |
<p class="description"><?php esc_attr_e( 'Category image', 'anspress-question-answer' ); ?></p> | |
</div> | |
<div class='form-field term-image-wrap'> | |
<label for='ap_icon'><?php esc_attr_e( 'Category icon class', 'anspress-question-answer' ); ?></label> | |
<input id="ap_icon" type="text" name="ap_icon" value=""> | |
<p class="description"><?php esc_attr_e( 'Font icon class, if image not set', 'anspress-question-answer' ); ?></p> | |
</div> | |
<div class='form-field term-image-wrap'> | |
<label for='ap-category-color'><?php esc_attr_e( 'Icon background color', 'anspress-question-answer' ); ?></label> | |
<input id="ap-category-color" type="text" name="ap_color" value=""> | |
<p class="description"><?php esc_attr_e( 'Set background color to be used with icon', 'anspress-question-answer' ); ?></p> | |
<script type="text/javascript"> | |
jQuery(document).ready(function(){ | |
jQuery('#ap-category-color').wpColorPicker(); | |
}); | |
</script> | |
</div> | |
<?php | |
} | |
/** | |
* Image field in category form. | |
* | |
* @param object $term Term. | |
*/ | |
public function image_field_edit( $term ) { | |
$term_meta = get_term_meta( $term->term_id, 'ap_category', true ); | |
$term_meta = wp_parse_args( | |
$term_meta, array( | |
'image' => [ | |
'id' => '', | |
'url' => '', | |
], | |
'icon' => '', | |
'color' => '', | |
) | |
); | |
?> | |
<tr class='form-field form-required term-name-wrap'> | |
<th scope='row'> | |
<label for='custom-field'><?php esc_attr_e( 'Image', 'anspress-question-answer' ); ?></label> | |
</th> | |
<td> | |
<a href="#" id="ap-category-upload" class="button" data-action="ap_media_uplaod" data-title="<?php esc_attr_e( 'Upload image', 'anspress-question-answer' ); ?>" data-idc="#ap_category_media_id" data-urlc="#ap_category_media_url"><?php esc_attr_e( 'Upload image', 'anspress-question-answer' ); ?></a> | |
<?php if ( ! empty( $term_meta['image'] ) && ! empty( $term_meta['image']['url'] ) ) { ?> | |
<img id="ap_category_media_preview" data-action="ap_media_value" src="<?php echo esc_url( $term_meta['image']['url'] ); ?>" /> | |
<?php } ?> | |
<input id="ap_category_media_url" type="hidden" data-action="ap_media_value" name="ap_category_image_url" value="<?php echo esc_url( $term_meta['image']['url'] ); ?>"> | |
<input id="ap_category_media_id" type="hidden" data-action="ap_media_value" name="ap_category_image_id" value="<?php echo esc_attr( $term_meta['image']['id'] ); ?>"> | |
<a href="#" id="ap-category-upload-remove" data-action="ap_media_remove"><?php esc_attr_e( 'Remove image', 'anspress-question-answer' ); ?></a> | |
<p class='description'><?php esc_attr_e( 'Featured image for category', 'anspress-question-answer' ); ?></p> | |
</td> | |
</tr> | |
<tr class='form-field term-name-wrap'> | |
<th scope='row'> | |
<label for='custom-field'><?php esc_attr_e( 'Category icon class', 'anspress-question-answer' ); ?></label> | |
</th> | |
<td> | |
<input id="ap_icon" type="text" name="ap_icon" value="<?php echo esc_attr( $term_meta['icon'] ); ?>"> | |
<p class="description"><?php esc_attr_e( 'Font icon class, if image not set', 'anspress-question-answer' ); ?></p> | |
</td> | |
</tr> | |
<tr class='form-field term-name-wrap'> | |
<th scope='row'> | |
<label for='ap-category-color'><?php esc_attr_e( 'Category icon color', 'anspress-question-answer' ); ?></label> | |
</th> | |
<td> | |
<input id="ap-category-color" type="text" name="ap_color" value="<?php echo esc_attr( $term_meta['color'] ); ?>"> | |
<p class="description"><?php esc_attr_e( 'Font icon class, if image not set', 'anspress-question-answer' ); ?></p> | |
<script type="text/javascript"> | |
jQuery(document).ready(function(){ | |
jQuery('#ap-category-color').wpColorPicker(); | |
}); | |
</script> | |
</td> | |
</tr> | |
<?php | |
} | |
/** | |
* Process and save category images. | |
* | |
* @param integer $term_id Term id. | |
*/ | |
public function save_image_field( $term_id ) { | |
$image_url = ap_isset_post_value( 'ap_category_image_url', '' ); | |
$image_id = ap_isset_post_value( 'ap_category_image_id', '' ); | |
$icon = ap_isset_post_value( 'ap_icon', '' ); | |
$color = ap_isset_post_value( 'ap_color', '' ); | |
if ( current_user_can( 'manage_categories' ) ) { | |
// Get options from database - if not a array create a new one. | |
$term_meta = get_term_meta( $term_id, 'ap_category', true ); | |
if ( ! is_array( $term_meta ) ) { | |
$term_meta = [ 'image' => [] ]; | |
} | |
if ( ! is_array( $term_meta['image'] ) ) { | |
$term_meta['image'] = []; | |
} | |
// Image url. | |
if ( ! empty( $image_url ) ) { | |
$term_meta['image']['url'] = esc_url( $image_url ); | |
} else { | |
unset( $term_meta['image']['url'] ); | |
} | |
// Image id. | |
if ( ! empty( $image_id ) ) { | |
$term_meta['image']['id'] = (int) $image_id; | |
} else { | |
unset( $term_meta['image']['id'] ); | |
} | |
// Category icon. | |
if ( ! empty( $icon ) ) { | |
$term_meta['icon'] = sanitize_text_field( $icon ); | |
} else { | |
unset( $term_meta['icon'] ); | |
} | |
// Category color. | |
if ( ! empty( $color ) ) { | |
$term_meta['color'] = sanitize_text_field( $color ); | |
} else { | |
unset( $term_meta['color'] ); | |
} | |
if ( empty( $term_meta['image'] ) ) { | |
unset( $term_meta['image'] ); | |
} | |
// Delete meta if empty. | |
if ( empty( $term_meta ) ) { | |
delete_term_meta( $term_id, 'ap_category' ); | |
} else { | |
update_term_meta( $term_id, 'ap_category', $term_meta ); | |
} | |
} // End if(). | |
} | |
/** | |
* Add category pages rewrite rule. | |
* | |
* @param array $rules AnsPress rules. | |
* @param string $slug Slug. | |
* @param integer $base_page_id Base page ID. | |
* @return array | |
* @since unknown | |
* @since 4.1.6 Fixed: category pagination. | |
*/ | |
public function rewrite_rules( $rules, $slug, $base_page_id ) { | |
$base_slug = get_page_uri( ap_opt( 'categories_page' ) ); | |
update_option( 'ap_categories_path', $base_slug, true ); | |
$cat_rules = array( | |
$base_slug . '/([^/]+)/page/?([0-9]{1,})/?$' => 'index.php?question_category=$matches[#]&paged=$matches[#]&ap_page=category', | |
$base_slug . '/([^/]+)/?$' => 'index.php?question_category=$matches[#]&ap_page=category', | |
); | |
return $cat_rules + $rules; | |
} | |
/** | |
* Filter main questions query args. Modify and add category args. | |
* | |
* @param array $args Questions args. | |
* @return array | |
*/ | |
public function ap_main_questions_args( $args ) { | |
global $wp; | |
$query = $wp->query_vars; | |
$categories_operator = ! empty( $wp->query_vars['ap_categories_operator'] ) ? $wp->query_vars['ap_categories_operator'] : 'IN'; | |
$current_filter = ap_get_current_list_filters( 'category' ); | |
if ( isset( $query['ap_categories'] ) && is_array( $query['ap_categories'] ) ) { | |
$args['tax_query'][] = array( | |
'taxonomy' => 'question_category', | |
'field' => 'slug', | |
'terms' => $query['ap_categories'], | |
'operator' => $categories_operator, | |
); | |
} elseif ( ! empty( $current_filter ) ) { | |
$args['tax_query'][] = array( | |
'taxonomy' => 'question_category', | |
'field' => 'term_id', | |
'terms' => explode( ',', sanitize_comma_delimited( $current_filter ) ), | |
); | |
} | |
return $args; | |
} | |
/** | |
* Subscriber action ID. | |
* | |
* @param integer $action_id Current action ID. | |
* @return integer | |
*/ | |
public function subscribers_action_id( $action_id ) { | |
if ( is_question_category() ) { | |
global $question_category; | |
$action_id = $question_category->term_id; | |
} | |
return $action_id; | |
} | |
/** | |
* Filter ask button link to append current category link. | |
* | |
* @param string $link Ask button link. | |
* @return string | |
*/ | |
public function ap_ask_btn_link( $link ) { | |
if ( is_question_category() ) { | |
$question_category = get_queried_object(); | |
return $link . '?category=' . $question_category->term_id; | |
} | |
return $link; | |
} | |
/** | |
* Filter canonical URL when in category page. | |
* | |
* @param string $canonical_url url. | |
* @return string | |
* @deprecated 4.1.1 | |
*/ | |
public function ap_canonical_url( $canonical_url ) { | |
if ( is_question_category() ) { | |
global $question_category; | |
if ( ! $question_category ) { | |
$question_category = get_queried_object(); | |
} | |
return get_term_link( $question_category ); // @codingStandardsIgnoreLine. | |
} | |
return $canonical_url; | |
} | |
/** | |
* Category feed link in head. | |
*/ | |
public function category_feed() { | |
if ( is_question_category() ) { | |
$question_category = get_queried_object(); | |
echo '<link href="' . esc_url( home_url( 'feed' ) ) . '?post_type=question&question_category=' . esc_url( $question_category->slug ) . '" title="' . esc_attr__( 'Question category feed', 'anspress-question-answer' ) . '" type="application/rss+xml" rel="alternate">'; | |
} | |
} | |
/** | |
* Ajax callback for loading order by filter. | |
* | |
* @since 4.0.0 | |
*/ | |
public function load_filter_category() { | |
$filter = ap_sanitize_unslash( 'filter', 'r' ); | |
check_ajax_referer( 'filter_' . $filter, '__nonce' ); | |
$search = (string) ap_sanitize_unslash( 'search', 'r', false ); | |
ap_ajax_json( | |
array( | |
'success' => true, | |
'items' => ap_get_category_filter( $search ), | |
'multiple' => true, | |
'nonce' => wp_create_nonce( 'filter_' . $filter ), | |
) | |
); | |
} | |
/** | |
* Output active category in filter | |
* | |
* @since 4.0.0 | |
*/ | |
public function filter_active_category( $active, $filter ) { | |
$current_filters = ap_get_current_list_filters( 'category' ); | |
if ( ! empty( $current_filters ) ) { | |
$args = array( | |
'hierarchical' => true, | |
'hide_if_empty' => true, | |
'number' => 2, | |
'include' => $current_filters, | |
); | |
$terms = get_terms( 'question_category', $args ); | |
if ( $terms ) { | |
$active_terms = []; | |
foreach ( (array) $terms as $t ) { | |
$active_terms[] = $t->name; | |
} | |
$count = count( $current_filters ); | |
$more_label = sprintf( __( ', %d+', 'anspress-question-answer' ), $count - 2 ); | |
return ': <span class="ap-filter-active">' . implode( ', ', $active_terms ) . ( $count > 2 ? $more_label : '' ) . '</span>'; | |
} | |
} | |
} | |
/** | |
* Column header. | |
* | |
* @param array $columns Category columns. | |
* @return array | |
*/ | |
public function column_header( $columns ) { | |
$columns['icon'] = 'Icon'; | |
return $columns; | |
} | |
/** | |
* Icon column content. | |
*/ | |
public function column_content( $value, $column_name, $tax_id ) { | |
if ( 'icon' === $column_name ) { | |
ap_category_icon( $tax_id ); | |
} | |
} | |
/** | |
* Modify current page to show category archive. | |
* | |
* @param string $query_var Current page. | |
* @return string | |
* @since 4.1.0 | |
*/ | |
public function ap_current_page( $query_var ) { | |
if ( 'categories' === $query_var && 'category' === get_query_var( 'ap_page' ) ) { | |
return 'category'; | |
} | |
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 | |
*/ | |
public function modify_query_category_archive( $posts, $query ) { | |
if ( $query->is_main_query() && $query->is_tax( 'question_category' ) && 'category' === get_query_var( 'ap_page' ) ) { | |
$query->found_posts = 1; | |
$query->max_num_pages = 1; | |
$page = get_page( ap_opt( 'categories_page' ) ); | |
$page->post_title = get_queried_object()->name; | |
$posts = [ $page ]; | |
} | |
return $posts; | |
} | |
/** | |
* Include required files. | |
* | |
* @since 4.1.8 | |
*/ | |
public function widget() { | |
require_once ANSPRESS_ADDONS_DIR . '/categories/widget.php'; | |
register_widget( 'Anspress\Widgets\Categories' ); | |
} | |
} | |
// Init addon. | |
Categories::init(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment