Current Path : /storage/v11800/affypharma/public_html/wp-content/plugins/auxin-elements/includes/classes/ |
Linux v11800 5.3.0-1023-aws #25~18.04.1-Ubuntu SMP Fri Jun 5 15:19:18 UTC 2020 aarch64
|
Current File : /storage/v11800/affypharma/public_html/wp-content/plugins/auxin-elements/includes/classes/class-auxin-permalink.php |
<?php
/**
* Class to add permalink setting for post types of theme
*
*
* @package Auxin
* @license LICENSE.txt
* @author averta
* @link http://phlox.pro/
* @copyright (c) 2010-2024 averta
*/
// no direct access allowed
if ( ! defined('ABSPATH') ) {
die();
}
/**
*
*/
class Auxin_Permalink {
public $prefix = "auxin_permalink";
public $theme_name = "averta";
public $theme_id = "averta";
public $option_group = "permalink";
public $default_post_types = array();
public function __construct() {
if( defined('THEME_NAME_I18N') ) $this->theme_name = THEME_NAME_I18N;
if( defined('THEME_ID' ) ) $this->theme_id = THEME_ID;
$this->default_post_types = auxin_registered_post_types(true );
}
/**
* Register and init with hooks
*
* @return void
*/
public function setup(){
// setup hooks
add_action( 'admin_init', array( $this, 'extend_permalinks_page' ) );
add_action( 'admin_init', array( $this, 'flush_rewrite_rules_queue') );
add_action( 'load-options-permalink.php' , array( $this, 'on_permalink_page' ), 15 );
}
/**
* Triggers on permalink setting page
*
* @return void
*/
public function on_permalink_page(){
if( ! $this->default_post_types ){
return;
}
// add auxin permalink fields section
$this->add_section();
foreach ( $this->default_post_types as $post_type ) {
$this->add_update_hooks( $post_type );
$this->add_posttype_fields( $post_type );
// store posted custom permalink slugs
if( isset( $_POST['submit'] ) && isset( $_POST['_wp_http_referer'] ) ){
if( strpos( $_POST['_wp_http_referer'],'options-permalink.php' ) !== false ) {
$this->store_permalink_options( $post_type );
}
}
}
}
/**
* Store the permalink options for a post type
*
* @param string $posty_type The post type
* @return void
*/
private function store_permalink_options( $post_type ){
$single_option_name = $this->get_structure( array( 'post_type' => $post_type, 'page_type' => 'single' ) );
// get post type structure
$structure = trim( sanitize_text_field( $_POST[ $single_option_name ] ) );
// default permalink structure
if( ! $structure ) $structure = $post_type;
$structure = trim( $structure, '/' );
set_theme_mod( $single_option_name, $structure );
// get post type object if available
$post_type_object = get_post_type_object( $post_type );
// if post type has archive enabled
if( ! empty( $post_type_object ) && $post_type_object->has_archive ){
$archive_option_name = $this->get_structure( array( 'post_type' => $post_type, 'page_type' => 'archive' ) );
// get post type structure
$structure = trim( sanitize_text_field( $_POST[$archive_option_name] ) );
// default permalink structure
if( ! $structure ) $structure = $post_type."/all";
$structure = trim( $structure, '/' );
set_theme_mod( $archive_option_name, $structure );
}
if( $taxonomies = get_object_taxonomies( $post_type, 'objects' ) ){
foreach ( $taxonomies as $tax => $tax_object ) {
if( empty( $tax_object->rewrite ) || empty( $tax_object->rewrite['slug'] ) ){
continue;
}
$tax_option_name = $this->get_structure( array( 'post_type' => $post_type, 'page_type' => $tax ) );
// get post type structure
$structure = trim( sanitize_text_field( $_POST[ $tax_option_name ] ) );
// default permalink structure
if( ! $structure ) $structure = $tax_object->rewrite['slug'];
$structure = trim( $structure, '/' );
set_theme_mod( $tax_option_name, $structure );
}
}
}
/**
* Flushes the pending rewrite rules
*
*/
public function pending_rewrite_rules( $mod_value ){
set_theme_mod( $this->prefix."_pending_rewrite_rules", 1 );
return $mod_value;
}
/**
* Flushes the queue of rewrite rules
*
* @return void
*/
public function flush_rewrite_rules_queue () {
if( get_theme_mod( $this->prefix."_pending_rewrite_rules", 1 ) ){
flush_rewrite_rules();
set_theme_mod( $this->prefix."_pending_rewrite_rules", 0 );
}
}
/**
* Extends the permalink page by adding new fields for post types
*
* @return void
*/
public function extend_permalinks_page(){
// Get enabled post types of theme
$this->set_current_post_types();
// This method fires for just one time
$this->set_default_permalink_slugs();
}
private function set_current_post_types(){
$auxin_active_post_types = auxin_get_possible_post_types(true);
$this->default_post_types = array_keys( $auxin_active_post_types );
}
/**
* Adds new section in permalink page
*/
private function add_section(){
add_settings_section(
'auxin_posttypes_permalink_setting_section',
sprintf( '<hr /><br />'.__( '%s Permalink Setting', 'auxin-elements' ), $this->theme_name ),
array( $this, 'posttypes_permalink_section_callback_function' ),
$this->option_group
);
}
/**
* Sets the default permalink slugs
*
*/
private function set_default_permalink_slugs(){
if( get_theme_mod( $this->prefix.'_permalink_options_initialized', 0 ) )
return;
foreach ( $this->default_post_types as $post_type ) {
$single_option_name = $this->get_structure( array( 'post_type' => $post_type, 'page_type' => 'single' ) );
// get post type structure
$structure = get_theme_mod( $single_option_name, '' );
// default permalink structure
if( ! $structure ) {
$structure = ( strpos( $post_type, 'aux_' ) !== FALSE ) ? trim( $post_type, 'aux_' ) : $post_type;
}
$structure = trim( $structure, '/' );
set_theme_mod( $single_option_name, $structure );
// get post type object if available
$post_type_object = get_post_type_object( $post_type );
// if post type has archive enabled
if( ! empty( $post_type_object ) && $post_type_object->has_archive ){
$archive_option_name = $this->get_structure( array( 'post_type' => $post_type, 'page_type' => 'archive' ) );
// get post type structure
$structure = get_theme_mod( $archive_option_name, '' );
// default permalink structure
if( ! $structure ) {
$structure = ( strpos( $post_type, 'aux_' ) !== FALSE ) ? trim( $post_type, 'aux_' ) : $post_type;
$structure .= '/all';
}
$structure = trim( $structure, '/' );
set_theme_mod( $archive_option_name, $structure );
}
if( $taxonomies = get_object_taxonomies( $post_type, 'objects' ) ){
foreach ( $taxonomies as $tax => $tax_object ) {
if( empty( $tax_object->rewrite ) || empty( $tax_object->rewrite['slug'] ) ){
continue;
}
$tax_option_name = $this->get_structure( array( 'post_type' => $post_type, 'page_type' => $tax ) );
// get post type structure
$structure = get_theme_mod( $tax_option_name, '' );
// default permalink structure
if( ! $structure ) {
$structure = $tax_object->rewrite['slug'];
}
$structure = trim( $structure, '/' );
set_theme_mod( $tax_option_name, $structure );
}
}
}
set_theme_mod( $this->prefix.'_permalink_options_initialized', 1 );
}
/**
* Flushes the queued rewrite rules
*
* @param string $post_type The post type name
*/
public function add_update_hooks( $post_type ){
$hook_suffix = $this->get_structure( array( 'post_type' => $post_type, 'page_type' => 'single' ) );
add_filter( 'pre_set_theme_mod_'. $hook_suffix , array( $this, 'pending_rewrite_rules' ), 10, 2 );
if( $this->post_type_has_archive( $post_type ) ){
$hook_suffix = $this->get_structure( array( 'post_type' => $post_type, 'page_type' => 'archive' ) );
add_filter( 'pre_set_theme_mod_'. $hook_suffix , array( $this, 'pending_rewrite_rules' ), 10, 2 );
}
if( $taxonomies = get_object_taxonomies( $post_type, 'objects' ) ){
foreach ( $taxonomies as $tax => $tax_object ) {
if( empty( $tax_object->rewrite ) || empty( $tax_object->rewrite['slug'] ) ){
continue;
}
$hook_suffix = $this->get_structure( array( 'post_type' => $post_type, 'page_type' => $tax ) );
add_filter( 'pre_set_theme_mod_'. $hook_suffix , array( $this, 'pending_rewrite_rules' ), 10, 2 );
}
}
}
private function add_posttype_fields( $post_type ){
$post_type_label = $post_type;
if( $post_object = get_post_type_object( $post_type ) ){
$post_type_label = $post_object->labels->singular_name;
}
add_settings_field( 'auxin_'.$post_type.'_structure',
sprintf(__('%s base', 'auxin-elements' ), $post_type_label ),
array( $this, 'posttypes_permalink_fields_callback_function' ),
$this->option_group,
'auxin_posttypes_permalink_setting_section',
array( 'post_type' => $post_type, 'page_type' => 'single' )
);
register_setting( $this->option_group,'auxin_'.$post_type.'_structure' );
if( $this->post_type_has_archive( $post_type ) ){
add_settings_field( 'auxin_'.$post_type.'_archive_structure',
sprintf(__('%s archive base', 'auxin-elements' ), $post_type_label ),
array( $this, 'posttypes_permalink_fields_callback_function'),
$this->option_group,
'auxin_posttypes_permalink_setting_section',
array( 'post_type' => $post_type, 'page_type' => 'archive' )
);
register_setting( $this->option_group,'auxin_'.$post_type.'_archive_structure' );
}
if( $taxonomies = get_object_taxonomies( $post_type, 'objects' ) ){
foreach ( $taxonomies as $tax => $tax_object ) {
if( empty( $tax_object->rewrite ) || empty( $tax_object->rewrite['slug'] ) ){
continue;
}
add_settings_field(
"auxin_{$post_type}_{$tax}_structure",
sprintf(__('%s base', 'auxin-elements' ), $tax_object->label ),
array( $this, 'posttypes_permalink_fields_callback_function'),
$this->option_group,
'auxin_posttypes_permalink_setting_section',
array( 'post_type' => $post_type, 'page_type' => $tax )
);
register_setting( $this->option_group, "auxin_{$post_type}_{$tax}_structure" );
}
}
}
/**
* Get permalink option structure
*
* @param array $args
* @return string The permalink structure
*/
private function get_structure( $args ){
$defaults = array(
'post_type' => '',
'page_type' => 'single' // single, archive, $taxonomy
);
$args = wp_parse_args( $args, $defaults );
if( empty( $args['post_type'] ) ){
_doing_it_wrong( __FUNCTION__, 'Post type is required.', '2' );
}
if( empty( $args['suffix'] ) ){
$args['suffix'] = 'single' == $args['page_type'] ? '' : '_'.$args['page_type'];
}
return str_replace('-', '_', $this->prefix.'_'. $args['post_type']. $args['suffix'] .'_structure' );
}
/**
* Generates the section for permalink options
*
* @return void
*/
public function posttypes_permalink_section_callback_function(){
esc_html_e('These settings control the permalinks used for theme\'s post types. These settings only apply when <strong>not using "default" permalink structure.</strong>.', 'auxin-elements' );
echo "<br /><br />";
}
/**
* Generates the input field for permalink options
*
* @param array $args
* @return void
*/
public function posttypes_permalink_fields_callback_function( $args ) {
$output_suffix = $args['page_type'] !== 'single' ? '' : '<code>/' . esc_html__( 'sample-post', 'auxin-elements' ).'/</code>';
$option_id = $this->get_structure( $args );
$val = get_theme_mod( $option_id );
printf( '<code>%1$s/</code><input id="%2$s" name="%2$s" type="text" value="%3$s" />%4$s', esc_url( home_url() ), esc_attr( $option_id ), esc_attr( $val ), $output_suffix );
}
/**
* Whether the post type has archive page or not
*
* @param string $post_type The post type name
* @return bool The post type has archive or not
*/
private function post_type_has_archive( $post_type ){
$post_type_object = get_post_type_object( $post_type );
return ! empty( $post_type_object ) && $post_type_object->has_archive;
}
}