AnsPress_Post_Table_Hooks()
Description #
Post table hooks.
Source #
File: admin/class-list-table-hooks.php
class AnsPress_Post_Table_Hooks {
/**
* Initialize the class
*/
public static function init() {
anspress()->add_filter( 'views_edit-question', __CLASS__, 'flag_view' );
anspress()->add_filter( 'views_edit-answer', __CLASS__, 'flag_view' );
anspress()->add_action( 'posts_clauses', __CLASS__, 'posts_clauses', 10, 2 );
anspress()->add_action( 'manage_answer_posts_custom_column', __CLASS__, 'answer_row_actions', 10, 2 );
anspress()->add_filter( 'manage_edit-question_columns', __CLASS__, 'cpt_question_columns' );
anspress()->add_action( 'manage_posts_custom_column', __CLASS__, 'custom_columns_value' );
anspress()->add_filter( 'manage_edit-answer_columns', __CLASS__, 'cpt_answer_columns' );
anspress()->add_filter( 'manage_edit-question_sortable_columns', __CLASS__, 'admin_column_sort_flag' );
anspress()->add_filter( 'manage_edit-answer_sortable_columns', __CLASS__, 'admin_column_sort_flag' );
anspress()->add_action( 'edit_form_after_title', __CLASS__, 'edit_form_after_title' );
anspress()->add_filter( 'manage_edit-comments_columns', __CLASS__, 'comment_flag_column' );
anspress()->add_filter( 'comment_status_links', __CLASS__, 'comment_flag_view' );
anspress()->add_action( 'current_screen', __CLASS__, 'comments_flag_query', 10, 2 );
anspress()->add_filter( 'post_updated_messages', __CLASS__, 'post_custom_message' );
// phpcs:ignore anspress()->add_filter( 'manage_comments_custom_column', __CLASS__, 'comment_flag_column_data', 10, 2 );
// phpcs:ignore anspress()->add_filter( 'post_row_actions', __CLASS__, 'add_question_flag_link', 10, 2 );
}
/**
* Add flagged post view.
*
* @param array $views Views array.
* @return array
* @since unknown
* @since 4.1.5 Fixed: flags count.
*/
public static function flag_view( $views ) {
global $post_type_object;
$flagged_count = ap_total_posts_count( 'answer' === $post_type_object->name ? 'answer' : 'question', 'flag' );
$class = ap_sanitize_unslash( 'flagged', 'p' ) ? 'class="current" ' : '';
$views['flagged'] = '<a ' . $class . 'href="edit.php?flagged=true&post_type=' . $post_type_object->name . '">' . __( 'Flagged', 'anspress-question-answer' ) . ' <span class="count">(' . $flagged_count->total . ')</span></a>';
return $views;
}
/**
* Modify SQL query.
*
* @param array $sql Sql claues.
* @param object $instance WP_Query instance.
* @return array
*/
public static function posts_clauses( $sql, $instance ) {
global $pagenow, $wpdb;
$vars = $instance->query_vars;
if ( ! in_array( $vars['post_type'], array( 'question', 'answer' ), true ) ) {
return $sql;
}
$sql['join'] = $sql['join'] . " LEFT JOIN {$wpdb->ap_qameta} qameta ON qameta.post_id = {$wpdb->posts}.ID";
$sql['fields'] = $sql['fields'] . ', qameta.*, qameta.votes_up - qameta.votes_down AS votes_net';
// Show only flagged posts.
if ( 'edit.php' === $pagenow && ap_sanitize_unslash( 'flagged', 'p' ) ) {
$sql['where'] = $sql['where'] . ' AND qameta.flags > 0';
$sql['orderby'] = ' qameta.flags DESC, ' . $sql['orderby'];
}
$orderby = ap_sanitize_unslash( 'orderby', 'p' );
$order = ap_sanitize_unslash( 'order', 'p' ) === 'asc' ? 'asc' : 'desc';
if ( 'flags' === $orderby ) {
// Sort by flags.
$sql['orderby'] = " qameta.flags {$order}";
} elseif ( 'answers' === $orderby ) {
// Sort by answers.
$sql['orderby'] = " qameta.answers {$order}";
} elseif ( 'votes' === $orderby ) {
// Sort by answers.
$sql['orderby'] = " votes_net {$order}";
}
return $sql;
}
/**
* Add action links below question/answer content in wp post list.
*
* @param string $column Current column name.
* @param integer $post_id Current post id.
*/
public static function answer_row_actions( $column, $post_id ) {
global $post, $mode;
if ( 'answer_content' !== $column ) {
return;
}
$content = ap_truncate_chars( wp_strip_all_tags( get_the_excerpt() ), 90 );
// Pregmatch will return an array and the first 80 chars will be in the first element.
echo '<a href="' . esc_url( get_permalink( $post->post_parent ) ) . '" class="row-title">' . esc_html( $content ) . '</a>';
// First set up some variables.
$actions = array();
$post_type_object = get_post_type_object( $post->post_type ); // override ok.
$can_edit_post = current_user_can( $post_type_object->cap->edit_post, $post->ID );
// Actions to delete/trash.
if ( current_user_can( $post_type_object->cap->delete_post, $post->ID ) ) {
if ( 'trash' === $post->post_status ) {
$_wpnonce = wp_create_nonce( 'untrash-post_' . $post_id );
$url = admin_url( 'post.php?post=' . $post_id . '&action=untrash&_wpnonce=' . $_wpnonce );
$actions['untrash'] = "<a title='" . esc_attr( __( 'Restore this item from the Trash', 'anspress-question-answer' ) ) . "' href='" . $url . "'>" . __( 'Restore', 'anspress-question-answer' ) . '</a>';
} elseif ( EMPTY_TRASH_DAYS ) {
$actions['trash'] = "<a class='submitdelete' title='" . esc_attr( __( 'Move this item to the Trash', 'anspress-question-answer' ) ) . "' href='" . get_delete_post_link( $post->ID ) . "'>" . __( 'Trash', 'anspress-question-answer' ) . '</a>';
}
if ( 'trash' === $post->post_status || ! EMPTY_TRASH_DAYS ) {
$actions['delete'] = "<a class='submitdelete' title='" . esc_attr( __( 'Delete this item permanently', 'anspress-question-answer' ) ) . "' href='" . get_delete_post_link( $post->ID, '', true ) . "'>" . __( 'Delete Permanently', 'anspress-question-answer' ) . '</a>';
}
}
if ( $can_edit_post ) {
// translators: %s is post title.
$anchor_title = sprintf( __( 'Edit “%s”', 'anspress-question-answer' ), $post->title );
$actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, '', true ) . '" title="' . esc_attr( $anchor_title ) . '" rel="permalink">' . __( 'Edit', 'anspress-question-answer' ) . '</a>';
}
// Actions to view/preview.
if ( in_array( $post->post_status, array( 'pending', 'draft', 'future' ), true ) && $can_edit_post ) {
// translators: %s is post title.
$anchor_title = sprintf( __( 'Preview “%s”', 'anspress-question-answer' ), $post->title );
$anchor_url = add_query_arg( 'preview', 'true', get_permalink( $post->ID ) );
$actions['view'] = '<a href="' . esc_url( $anchor_url ) . '" title="' . esc_attr( $anchor_title ) . '" rel="permalink">' . __( 'Preview', 'anspress-question-answer' ) . '</a>';
} elseif ( 'trash' !== $post->post_status ) {
// translators: %s is post title.
$anchor_title = sprintf( __( 'View “%s”', 'anspress-question-answer' ), $post->title );
$actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( $anchor_title ) . '" rel="permalink">' . __( 'View', 'anspress-question-answer' ) . '</a>';
}
$wp_list_table = new WP_List_Table();
echo $wp_list_table->row_actions( $actions ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
/**
* Add clear flag action button in question list.
*
* @param array $actions Actions array.
* @param object $post Post object.
*/
public static function add_question_flag_link( $actions, $post ) {
if ( ap_get_post_field( 'flags', $post ) ) {
$actions['flag'] = '<a href="#" data-query="ap_clear_flag::' . wp_create_nonce( 'clear_flag_' . $post->ID ) . '::' . $post->ID . '" class="ap-ajax-btn flag-clear" data-cb="afterFlagClear">' . __( 'Clear flag', 'anspress-question-answer' ) . '</a>';
}
return $actions;
}
/**
* Alter columns in question cpt.
*
* @param array $columns Table column.
* @return array
* @since 2.0.0
*/
public static function cpt_question_columns( $columns ) {
$columns = array();
$columns['cb'] = '<input type="checkbox" />';
$columns['ap_author'] = __( 'Author', 'anspress-question-answer' );
$columns['title'] = __( 'Title', 'anspress-question-answer' );
if ( taxonomy_exists( 'question_category' ) ) {
$columns['question_category'] = __( 'Category', 'anspress-question-answer' );
}
if ( taxonomy_exists( 'question_tag' ) ) {
$columns['question_tag'] = __( 'Tag', 'anspress-question-answer' );
}
$columns['status'] = __( 'Status', 'anspress-question-answer' );
$columns['answers'] = __( 'Ans', 'anspress-question-answer' );
$columns['comments'] = __( 'Comments', 'anspress-question-answer' );
$columns['votes'] = __( 'Votes', 'anspress-question-answer' );
$columns['flags'] = __( 'Flags', 'anspress-question-answer' );
$columns['date'] = __( 'Date', 'anspress-question-answer' );
return $columns;
}
/**
* Custom post table column values.
*
* @param string $column Columns name.
*/
public static function custom_columns_value( $column ) {
global $post;
if ( ! in_array( $post->post_type, array( 'question', 'answer' ), true ) ) {
return $column;
}
if ( 'ap_author' === $column ) {
echo '<a class="ap-author-col" href="' . esc_url( ap_user_link( $post->post_author ) ) . '">';
ap_author_avatar( 28 );
echo '<span>' . esc_attr( ap_user_display_name() ) . '</span>';
echo '</a>';
} elseif ( 'status' === $column ) {
global $wp_post_statuses;
echo '<span class="post-status">';
if ( isset( $wp_post_statuses[ $post->post_status ] ) ) {
echo esc_attr( $wp_post_statuses[ $post->post_status ]->label );
}
echo '</span>';
} elseif ( 'question_category' === $column && taxonomy_exists( 'question_category' ) ) {
$category = get_the_terms( $post->ID, 'question_category' );
if ( ! empty( $category ) ) {
$out = array();
foreach ( (array) $category as $cat ) {
$out[] = edit_term_link( $cat->name, '', '', $cat, false );
}
echo join( ', ', $out ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
esc_html_e( '--', 'anspress-question-answer' );
}
} elseif ( 'question_tag' === $column && taxonomy_exists( 'question_tag' ) ) {
$terms = get_the_terms( $post->ID, 'question_tag' );
if ( ! empty( $terms ) ) {
$out = array();
foreach ( (array) $terms as $term ) {
$url = esc_url(
add_query_arg(
array(
'post_type' => $post->post_type,
'question_tag' => $term->slug,
),
'edit.php'
)
);
$out[] = sprintf( '<a href="%s">%s</a>', $url, esc_html( sanitize_term_field( 'name', $term->name, $term->term_id, 'question_tag', 'display' ) ) );
}
echo join( ', ', $out ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
esc_attr_e( '--', 'anspress-question-answer' );
}
} elseif ( 'answers' === $column ) {
$url = add_query_arg(
array(
'post_type' => 'answer',
'post_parent' => $post->ID,
),
'edit.php'
);
// translators: %d is total numbers of answer.
$anchor_title = sprintf( _n( '%d Answer', '%d Answers', $post->answers, 'anspress-question-answer' ), $post->answers );
echo '<a class="ans-count" title="' . esc_html( $anchor_title ) . '" href="' . esc_url( $url ) . '">' . esc_attr( $post->answers ) . '</a>';
} elseif ( 'parent_question' === $column ) {
$url = add_query_arg(
array(
'post' => $post->post_parent,
'action' => 'edit',
),
'post.php'
);
echo '<a class="parent_question" href="' . esc_url( $url ) . '"><strong>' . esc_html( get_the_title( $post->post_parent ) ) . '</strong></a>';
} elseif ( 'votes' === $column ) {
echo '<span class="vote-count">' . esc_attr( $post->votes_net ) . '</span>';
} elseif ( 'flags' === $column ) {
echo '<span class="flag-count' . ( $post->flags ? ' flagged' : '' ) . '">' . esc_attr( $post->flags ) . '</span>';
}
}
/**
* Answer CPT columns.
*
* @param array $columns Columns.
* @return array
* @since 2.0.0
*/
public static function cpt_answer_columns( $columns ) {
$columns = array(
'cb' => '<input type="checkbox" />',
'ap_author' => __( 'Author', 'anspress-question-answer' ),
'answer_content' => __( 'Content', 'anspress-question-answer' ),
'status' => __( 'Status', 'anspress-question-answer' ),
'comments' => __( 'Comments', 'anspress-question-answer' ),
'votes' => __( 'Votes', 'anspress-question-answer' ),
'flags' => __( 'Flags', 'anspress-question-answer' ),
'date' => __( 'Date', 'anspress-question-answer' ),
);
return $columns;
}
/**
* Flag sorting.
*
* @param array $columns Sorting columns.
* @return array
*/
public static function admin_column_sort_flag( $columns ) {
$columns['flags'] = 'flags';
$columns['answers'] = 'answers';
$columns['votes'] = 'votes';
return $columns;
}
/**
* Show question detail above new answer.
*
* @return void
* @since 2.0
*/
public static function edit_form_after_title() {
global $typenow, $pagenow, $post;
if ( in_array( $pagenow, array( 'post-new.php', 'post.php' ), true ) && 'answer' === $post->post_type ) {
$post_parent = ap_sanitize_unslash( 'action', 'g', false ) ? $post->post_parent : ap_sanitize_unslash( 'post_parent', 'g' );
echo '<div class="ap-selected-question">';
if ( ! isset( $post_parent ) ) {
echo '<p class="no-q-selected">' . esc_attr__( 'This question is orphan, no question is selected for this answer', 'anspress-question-answer' ) . '</p>';
} else {
$q = ap_get_post( $post_parent );
$answers = ap_get_post_field( 'answers', $q );
?>
<a class="ap-q-title" href="<?php echo esc_url( get_permalink( $q->post_id ) ); ?>">
<?php echo esc_attr( $q->post_title ); ?>
</a>
<div class="ap-q-meta">
<span class="ap-a-count">
<?php
echo esc_html(
// translators: %d is answers count.
sprintf( _n( '%d Answer', '%d Answers', $answers, 'anspress-question-answer' ), $answers )
);
?>
</span>
<span class="ap-edit-link">|
<a href="<?php echo esc_url( get_edit_post_link( $q->ID ) ); ?>">
<?php esc_attr_e( 'Edit question', 'anspress-question-answer' ); ?>
</a>
</span>
</div>
<div class="ap-q-content"><?php echo wp_kses_post( $q->post_content ); ?></div>
<input type="hidden" name="post_parent" value="<?php echo esc_attr( $post_parent ); ?>" />
<?php
}
echo '</div>';
}
}
/**
* Adds flags column in comment table.
*
* @param array $columns Comments table columns.
* @since 2.4
*/
public static function comment_flag_column( $columns ) {
$columns['comment_flag'] = __( 'Flag', 'anspress-question-answer' );
return $columns;
}
/**
* Show comment_flag data in comment table.
*
* @param string $column name of the comment table column.
* @param integer $comment_id Current comment ID.
* @return void
* @todo fix undefined constant `ANSPRESS_FLAG_META`.
*/
public static function comment_flag_column_data( $column, $comment_id ) {
if ( 'comment_flag' === $column ) {
$count = get_comment_meta( $comment_id, ANSPRESS_FLAG_META, true );
if ( $count ) {
echo '<span class="ap-comment-col-flag">';
echo esc_html( $count );
echo '</span>';
}
}
}
/**
* Add flag view link in comment table
*
* @param array $views view items array.
* @return array
*/
public static function comment_flag_view( $views ) {
$views['flagged'] = '<a href="edit-comments.php?show_flagged=true"' . ( ap_sanitize_unslash( 'show_flagged', 'g' ) ? ' class="current"' : '' ) . '>' . esc_attr__( 'Flagged', 'anspress-question-answer' ) . '</a>';
return $views;
}
/**
* Delay hooking our clauses filter to ensure it's only applied when needed.
*
* @param object $screen Current screen.
*/
public static function comments_flag_query( $screen ) {
if ( 'edit-comments' !== $screen->id ) {
return;
}
// Check if our Query Var is defined.
if ( ap_sanitize_unslash( 'show_flagged', 'p' ) ) {
add_action( 'comments_clauses', array( 'AnsPress_Admin', 'filter_comments_query' ) );
}
}
/**
* Custom post update message.
*
* @param array $messages Messages.
* @return array
*/
public static function post_custom_message( $messages ) {
global $post;
if ( 'answer' === $post->post_type && (int) ap_sanitize_unslash( 'message', 'g' ) === 99 ) {
add_action( 'admin_notices', array( __CLASS__, 'ans_notice' ) );
}
return $messages;
}
/**
* Answer error when there is not any question set.
*/
public static function ans_notice() {
echo '<div class="error">
<p>' . esc_html__( 'Please fill parent question field, Answer was not saved!', 'anspress-question-answer' ) . '</p>
</div>';
}
}
Expand full source code Collapse full source code View on GitHub: admin/class-list-table-hooks.php:23
Add your comment