Current File : /home/pacjaorg/public_html/copwordpres/wp-content/plugins/betterdocs/includes/Core/Rewrite.php
<?php

namespace WPDeveloper\BetterDocs\Core;

use WP_Post;
use WPDeveloper\BetterDocs\Utils\Base;
use WPDeveloper\BetterDocs\Utils\Database;

class Rewrite extends Base {
    protected $settings;
    protected $database;

    public function __construct( Settings $settings, Database $database ) {
        $this->settings = $settings;
        $this->database = $database;
    }

    public function init() {
        add_action( 'init', [$this, 'rules'] );
        add_action( 'betterdocs::settings::saved', [$this, 'save_permalink_structure'], 2, 3 );
    }

    public function remove_knowledge_base_placeholder( $permalink ) {
        $permalink_array = $this->permalink_structure( $permalink, 'arraywithpercent' );
        $permalink_array = array_filter( $permalink_array, function ( $item ) {
            return $item !== '%knowledge_base%';
        } );

        return trailingslashit( implode( '/', $permalink_array ) );
    }

    /**
     * This method is hooked with an action called 'betterdocs::settings::saved'
     *
     * @since 2.5.0
     *
     * @param bool $_saved
     * @param array $_settings
     * @param array $_old_settings
     *
     * @return void
     */
    public function save_permalink_structure( $_saved, $_settings, $_old_settings ) {
        if ( ! isset( $_settings['permalink_structure'] ) ) {
            return;
        }

        $_permalink_structure = $_settings['permalink_structure'];

        /**
         * TODO: Let's re-check later to optimize it.
         */
        if ( ! betterdocs()->is_pro_active() ) {
            $_permalink_structure = $this->remove_knowledge_base_placeholder( $_permalink_structure );
        }

        if ( $_permalink_structure !== $_old_settings['permalink_structure'] ) {
            $this->settings->save( 'permalink_structure', $this->permalink_structure( $_permalink_structure ) );
        }

        $old_docs_page     = isset( $_old_settings['docs_page'] ) ? $_old_settings['docs_page'] : '';
        $current_docs_page = isset( $_settings['docs_page'] ) ? $_settings['docs_page'] : '';

        /**
         * This block of code decides whether it needs to be flushed or not.
         * Flush happens after register the post type.
         */
        switch ( true ) {
            case $_permalink_structure !== $_old_settings['permalink_structure']:
            case $_settings['docs_slug'] !== $_old_settings['docs_slug']:
            case $_settings['builtin_doc_page'] !== $_old_settings['builtin_doc_page']:
            case $current_docs_page !== $old_docs_page:
            case $_settings['tag_slug'] !== $_old_settings['tag_slug']:
            case $_settings['category_slug'] !== $_old_settings['category_slug']:
                $this->database->set_transient( 'betterdocs_flush_rewrite_rules', true );
                break;
        }
    }

    public function permalink_structure( $structure = '', $output = 'string' ) {
        if ( empty( $structure ) ) {
            $structure = $this->settings->get( 'permalink_structure', 'docs' );
        }

        $docs_slug = $this->get_base_slug();

        $_structure_array = explode( '%', $structure );
        if ( $_structure_array[0] == '/' ) {
            $structure = $docs_slug . $structure;
        } else if ( $_structure_array[0] == '' ) {
            $structure = $docs_slug . '/' . $structure;
        }

        $structure = trim( $structure, '/' );

        if ( $output === 'string' ) {
            return $structure;
        }

        if ( $output === 'array' ) {
            $structure = explode( '/', $structure );
            $structure = array_map( function ( $item ) {
                return trim( $item, "/%" );
            }, $structure );
        }

        if ( $output === 'arraywithpercent' ) {
            $structure = explode( '/', $structure );
            $structure = array_map( function ( $item ) {
                return trim( $item, "/" );
            }, $structure );
        }

        return $structure;
    }

    public function get_base_slug() {
        $docs_slug        = $this->settings->get( 'docs_slug', 'docs' );
        $docs_page        = $this->settings->get( 'docs_page', 0 );
        $builtin_doc_page = $this->settings->get( 'builtin_doc_page', true );

        if ( ! $builtin_doc_page && $docs_page !== 0 ) {
            $post_info = get_post( $docs_page );
            $docs_slug = $post_info instanceof WP_Post ? $post_info->post_name : $docs_slug;
        }

        $docs_slug = trim( $docs_slug, '/' );

        return $docs_slug;
    }

    public function normalzie_doc_perma_structure( $structure ) {
        $structure = $this->permalink_structure( $structure, 'arraywithpercent' );
        $structure = array_reduce( $structure, function ( $carry, $item ) {
            if ( strpos( $item, '%' ) !== false ) {
                $carry[] = $item;
            } else {
                if ( $carry && strpos( end( $carry ), '%' ) === false ) {
                    $carry[count( $carry ) - 1] .= "/$item";
                } else {
                    $carry[] = $item;
                }
            }

            return $carry;
        }, [] );

        $structure[] = '%docs%';

        $group = array_filter( $structure, function ( $item ) {
            return strpos( $item, '%' ) === 0;
        } );

        return [
            'raw'   => $structure,
            'group' => $group
        ];
    }

    public function make_regex( $segments ) {
        return array_reduce( $segments, function ( $carry, $item ) {
            $carry .= ( strpos( $item, '%' ) !== false ? "([^/]+)" : $item ) . '/';
            return $carry;
        }, '' ) . '?$';
    }

    public function make_query( $segments ) {
        $query   = [];
        $matchId = 1;

        foreach ( $segments as $segment ) {
            $query[] = trim( $segment, '%' ) . '=$matches[' . $matchId . ']';
            $matchId++;
        }

        return 'index.php?' . implode( '&', $query ) . '&post_type=docs';
    }

    public function rules() {
        /**
         * docs can be dynamic / as its a root slug
         *
         * https://url/docs/kb-slug
         * https://url/docs/kb-slug/category-slug
         * https://url/docs-category/category-slug
         *
         * Docs Visit:
         * docs can be dynamic / as its a root slug
         * or docs can be change by settings.
         *
         * https://url/docs/(docs-slug)
         * https://url/docs/(cat-slug)/(docs-slug)
         * https://url/docs/(kb-slug)/(docs-slug)
         * https://url/docs/(kb-slug)/(cat-slug)/(docs-slug)
         * https://url/docs/(cat-slug)/(kb-slug)/(docs-slug)
         */

        /**
         * This code of blocks used to determine single docs permalink.
         */
        $_docs_perma_struct    = betterdocs()->settings->get( 'permalink_structure', 'docs' );
        $_normalized_structure = $this->normalzie_doc_perma_structure( $_docs_perma_struct );

        $_feed_regex   = $_normalized_structure['raw'];
        $_feed_regex[] = '(feed|rdf|rss|rss2|atom)';
        $_feed_group   = $_normalized_structure['group'];
        $_feed_group[] = '%feed%';

        $this->add_rewrite_rule( $this->make_regex( $_feed_regex ), $this->make_query( $_feed_group ) );

        $this->add_rewrite_rule(
            $this->make_regex( $_normalized_structure['raw'] ),
            $this->make_query( $_normalized_structure['group'] )
        );

        $base = $this->get_base_slug();
        $this->add_rewrite_rule( $base . '/(feed|rdf|rss|rss2|atom)/?$', 'index.php?post_type=docs&feed=$matches[1]' );
    }

    public function add_rewrite_rule( $regex, $query, $after = 'top' ) {
        add_rewrite_rule( $regex, $query, $after );
    }

    public function docs_type_rewrite( $rewrite, $slug ) {
        $permalink           = betterdocs()->settings->get( 'permalink_structure', 'docs/' );
        $permalink_structure = $this->permalink_structure( $permalink, 'array' );
        $permalink           = apply_filters( 'betterdocs_docs_type_rewrite_permalink', $permalink, $slug, $permalink_structure );

        /**
         * TODO: Let's re-check later for optimization.
         */
        if ( ! betterdocs()->is_pro_active() ) {
            $permalink = $this->remove_knowledge_base_placeholder( $permalink );
        }

        return apply_filters( 'betterdocs_docs_rewrite', [
            'slug'       => trim( $permalink, '/' ),
            'with_front' => false
        ], $slug );
    }
}
Site is undergoing maintenance

PACJA Events

Maintenance mode is on

Site will be available soon. Thank you for your patience!