This commit is contained in:
2026-07-02 15:54:39 -06:00
commit 9883323161
17470 changed files with 4470592 additions and 0 deletions
@@ -0,0 +1,236 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Functions used to create, edit and remove custom permalinks
*/
class Permalink_Manager_URI_Functions {
public function __construct() {
}
/**
* Get the custom permalink's array key for specific post or term
*
* @param WP_Post|WP_Term|int|string $element
* @param bool $is_tax
*
* @return array
*/
public static function get_single_uri_key( $element, $is_tax = false ) {
if ( ! empty( $element->term_id ) ) {
$is_term = true;
$element_id = $element->term_id;
} else if ( ! empty( $element->ID ) ) {
$is_term = false;
$element_id = $element->ID;
} else if ( is_string( $element ) || is_numeric( $element ) ) {
$is_term = ( strpos( $element, 'tax-' ) !== false ) ? true : $is_tax;
$element_id = preg_replace( '/[^0-9]/', '', $element );
} else {
$element_id = "";
$is_term = null;
}
$array_index = ( $is_term && ! empty( $element_id ) ) ? sprintf( 'tax-%s', $element_id ) : $element_id;
return array( $element_id, $is_term, $array_index );
}
/**
* Get the single custom permalink
*
* @param WP_Post|WP_Term|int $element
* @param bool $native_uri
* @param bool $no_fallback
*/
public static function get_single_uri( $element, $native_uri = false, $no_fallback = false, $is_tax = false ) {
// Get the element key
list( $element_id, $is_term, $array_index ) = self::get_single_uri_key( $element, $is_tax );
if ( $is_term ) {
$final_uri = ( class_exists( 'Permalink_Manager_URI_Functions_Tax' ) ) ? Permalink_Manager_URI_Functions_Tax::get_term_uri( $element_id, $native_uri, $no_fallback ) : '';
} else {
$final_uri = Permalink_Manager_URI_Functions_Post::get_post_uri( $element_id, $native_uri, $no_fallback );
}
return $final_uri;
}
/**
* Save single custom permalink to the custom permalinks array
*
* @param int|string $element
* @param string $element_uri
* @param bool $is_tax
* @param bool $db_save
*/
public static function save_single_uri( $element, $element_uri = null, $is_tax = false, $db_save = false ) {
global $permalink_manager_uris;
// Get the element key
list( $element_id, $is_term, $array_index ) = self::get_single_uri_key( $element, $is_tax );
// Save the custom permalink if the URI is not empty
if ( ! empty( $array_index ) && ! empty( $element_uri ) ) {
$permalink_manager_uris[ $array_index ] = Permalink_Manager_Helper_Functions::sanitize_title( $element_uri, true );
if ( $db_save ) {
self::save_all_uris( $permalink_manager_uris );
}
}
}
/**
* Remove single custom permalink from the custom permalinks array
*
* @param int|string $element
* @param bool $is_tax
* @param bool $db_save
*/
public static function remove_single_uri( $element, $is_tax = false, $db_save = false ) {
global $permalink_manager_uris;
// Get the element key
list( $element_id, $is_term, $array_index ) = self::get_single_uri_key( $element, $is_tax );
// Check if the custom permalink is assigned to this element
if ( ! empty( $array_index ) && isset( $permalink_manager_uris[ $array_index ] ) ) {
unset( $permalink_manager_uris[ $array_index ] );
}
if ( $db_save ) {
self::save_all_uris( $permalink_manager_uris );
}
}
/**
* Find the ID(s) of the element(s) by its custom permalink
*
* @param string $search_query
* @param bool $strict_search
* @param string $content_type
*
* @return bool|string|array
*/
public static function find_uri( $search_query, $strict_search = true, $content_type = null ) {
$custom_permalinks = self::get_all_uris();
$found = false;
if ( $strict_search ) {
$all_uris = array_flip( $custom_permalinks );
$found = ( ! empty( $all_uris[ $search_query ] ) ) ? $all_uris[ $search_query ] : false;
} else {
$found = array();
$search_query = preg_quote( $search_query, '/' );
foreach ( $custom_permalinks as $id => $uri ) {
if ( preg_match( "/\b$search_query\b/i", $uri ) ) {
if ( $content_type == 'taxonomies' && ( strpos( $id, 'tax-' ) !== false ) ) {
$found[] = (int) abs( filter_var( $id, FILTER_SANITIZE_NUMBER_INT ) );
} else if ( $content_type == 'posts' && is_numeric( $id ) ) {
$found[] = (int) filter_var( $id, FILTER_SANITIZE_NUMBER_INT );
} else if ( empty( $content_type ) ) {
$found[] = $id;
}
}
}
}
return $found;
}
/**
* Check if a single URI is duplicated
*
* @param string $uri
* @param int $element_id
* @param array $duplicated_ids
*
* @return bool
*/
public static function is_uri_duplicated( $uri, $element_id, $duplicated_ids = array() ) {
$custom_permalinks = Permalink_Manager_URI_Functions::get_all_uris();
if ( empty( $uri ) || empty( $element_id ) || empty( $custom_permalinks ) ) {
return false;
}
$uri = trim( trim( sanitize_text_field( $uri ) ), "/" );
$element_id = sanitize_text_field( $element_id );
// Keep the URIs in a separate array just here
if ( ! empty( $duplicated_ids ) ) {
$all_duplicates = $duplicated_ids;
} else if ( in_array( $uri, $custom_permalinks ) ) {
$all_duplicates = array_keys( $custom_permalinks, $uri );
}
if ( ! empty( $all_duplicates ) ) {
// Get the language code of current element
$this_uri_lang = apply_filters( 'permalink_manager_get_language_code', '', $element_id );
foreach ( $all_duplicates as $key => $duplicated_id ) {
// Ignore custom redirects
if ( strpos( $key, 'redirect-' ) !== false ) {
unset( $all_duplicates[ $key ] );
continue;
}
if ( $this_uri_lang ) {
$duplicated_uri_lang = apply_filters( 'permalink_manager_get_language_code', '', $duplicated_id );
}
// Ignore the URI for requested element and other elements in other languages to prevent the false alert
if ( ( ! empty( $duplicated_uri_lang ) && $duplicated_uri_lang !== $this_uri_lang ) || $element_id == $duplicated_id ) {
unset( $all_duplicates[ $key ] );
}
}
return ( count( $all_duplicates ) > 0 ) ? true : false;
} else {
return false;
}
}
/**
* Get the array (or statistics) with custom permalinks
*
* @param bool $stats
*
* @return array
*/
public static function get_all_uris( $stats = false ) {
global $permalink_manager_uris;
if ( $stats ) {
$custom_permalinks_size = strlen( serialize( $permalink_manager_uris ) );
$custom_permalinks_count = count( $permalink_manager_uris );
return array( $custom_permalinks_size, $custom_permalinks_count );
} else {
return array_filter( $permalink_manager_uris );
}
}
/**
* Save the array with custom permalinks
*
* @param array $updated_uris
*/
public static function save_all_uris( $updated_uris = null ) {
if ( is_null( $updated_uris ) ) {
global $permalink_manager_uris;
$updated_uris = $permalink_manager_uris;
}
if ( is_array( $updated_uris ) && ! empty( $updated_uris ) ) {
update_option( 'permalink-manager-uris', $updated_uris, false );
}
}
}