*/ 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 .= '
' . apply_filters( 'rank_math/bbpress/solved_text', $text, $is_solved ) . '
'; 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() { ?>