You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

183 lines
4.6 KiB
PHP

<?php
/**
* BBPress module.
*
* @since 1.0
* @package RankMathPro
* @subpackage RankMathPro
* @author Rank Math <support@rankmath.com>
*/
namespace RankMathPro;
use RankMath\Traits\Hooker;
use RankMath\Traits\Ajax;
use MyThemeShop\Helpers\Param;
defined( 'ABSPATH' ) || exit;
/**
* BBPress class.
*
* @codeCoverageIgnore
*/
class BBPress {
use Hooker, Ajax;
/**
* Post meta key for solved answers.
*
* @var string
*/
public $meta_key = '';
/**
* Constructor.
*/
public function __construct() {
$this->meta_key = 'rank_math_bbpress_solved_answer';
$this->action( 'wp', 'hooks' );
$this->ajax( 'mark_answer_solved', 'mark_answer_solved' );
$this->action( 'rank_math/json_ld', 'add_qa_schema', 99 );
}
/**
* Init hooks.
*/
public function hooks() {
if ( ! is_singular( 'topic' ) || ! current_user_can( 'moderate', get_the_ID() ) ) {
return;
}
$this->action( 'bbp_get_reply_content', 'add_solved_answer_button', 9, 2 );
$this->action( 'wp_enqueue_scripts', 'enqueue' );
$this->action( 'wp_footer', 'add_css' );
}
/**
* Enqueue Script required by plugin.
*/
public function enqueue() {
wp_enqueue_script( 'rank-math-bbpress', RANK_MATH_PRO_URL . 'includes/modules/bbPress/assets/js/bbpress.js', [ 'jquery' ], RANK_MATH_PRO_VERSION, true );
}
/**
* Add Mark Reply as Solved button to the Reply content.
*
* @param string $content Original reply content.
* @param int $reply_id Reply ID.
*
* @return string $content New content.
*/
public function add_solved_answer_button( $content, $reply_id ) {
$reply = bbp_get_reply( $reply_id );
if ( empty( $reply ) ) {
return $content;
}
$topic_id = bbp_get_reply_topic_id();
$answered = (int) get_post_meta( $topic_id, $this->meta_key, true );
$solved_text = __( 'Mark Unsolved.', 'rank-math-pro' );
$unsolved_text = __( 'Mark Solved.', 'rank-math-pro' );
$is_solved = $reply_id === $answered;
$class = metadata_exists( 'post', $topic_id, $this->meta_key ) && ! $is_solved ? 'rank-math-hidden' : '';
$text = $is_solved ? $solved_text : $unsolved_text;
$content .= '
<div class="rank-math-mark-solved ' . esc_attr( $class ) . '">
<a
href="#"
data-id="' . esc_attr( $reply_id ) . '"
data-topic-id="' . esc_attr( $topic_id ) . '"
data-solved-text="' . esc_attr( $solved_text ) . '"
data-unsolved-text="' . esc_attr( $unsolved_text ) . '"
data-is-solved="' . $is_solved . '">'
. apply_filters( 'rank_math/bbpress/solved_text', $text, $is_solved )
. '</a>
</div>';
return $content;
}
/**
* AJAX function to mark answer as solved.
*/
public function mark_answer_solved() {
check_ajax_referer( 'rank-math-ajax-nonce', 'security' );
$topic = Param::post( 'topic' );
if ( ! current_user_can( 'moderate', $topic ) ) {
return false;
}
$is_solved = Param::post( 'isSolved' );
if ( $is_solved ) {
return delete_post_meta( $topic, $this->meta_key );
}
$reply = Param::post( 'reply' );
return update_post_meta( $topic, $this->meta_key, $reply );
}
/**
* Add QA Schema Data.
*
* @param array $data Array of json-ld data.
* @return array
*/
public function add_qa_schema( $data ) {
if ( ! is_singular( 'topic' ) ) {
return $data;
}
global $post;
$approved_answer = get_post_meta( $post->ID, $this->meta_key, true );
if ( ! $approved_answer ) {
return $data;
}
$data[] = [
'@type' => 'QAPage',
'mainEntity' => [
'@type' => 'Question',
'name' => get_the_title( $post ),
'text' => get_the_excerpt( $post ),
'dateCreated' => get_post_time( 'Y-m-d\TH:i:sP', false ),
'answerCount' => get_post_meta( $post->ID, '_bbp_reply_count', true ),
'author' => [
'@type' => 'Person',
'name' => get_the_author(),
],
'acceptedAnswer' => [
'@type' => 'Answer',
'text' => get_post_field( 'post_content', $approved_answer ),
'dateCreated' => get_post_time( 'Y-m-d\TH:i:sP', false, $approved_answer ),
'url' => bbp_get_reply_url( $approved_answer ),
'author' => [
'@type' => 'Person',
'name' => bbp_get_reply_author( $approved_answer ),
],
],
],
];
return $data;
}
/**
* Add CSS inline, once.
*/
public function add_css() {
?>
<style type="text/css">
.rank-math-mark-solved {
text-align: right;
}
.rank-math-hidden {
display: none;
}
</style>
<?php
}
}