Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/litespee.../src
File: utility.cls.php
[500] Fix | Delete
/**
[501] Fix | Delete
* Make URL relative to the site root (preserves subdir).
[502] Fix | Delete
*
[503] Fix | Delete
* @param string $url Absolute URL.
[504] Fix | Delete
* @return string Relative URL starting with '/'.
[505] Fix | Delete
*/
[506] Fix | Delete
public static function make_relative( $url ) {
[507] Fix | Delete
self::domain_const();
[508] Fix | Delete
if ( 0 === strpos( $url, LSCWP_DOMAIN ) ) {
[509] Fix | Delete
$url = substr( $url, strlen( LSCWP_DOMAIN ) );
[510] Fix | Delete
}
[511] Fix | Delete
return trim( $url );
[512] Fix | Delete
}
[513] Fix | Delete
[514] Fix | Delete
/**
[515] Fix | Delete
* Extract just the scheme+host portion from a URL.
[516] Fix | Delete
*
[517] Fix | Delete
* @since 1.7.1
[518] Fix | Delete
*
[519] Fix | Delete
* @param string $url URL.
[520] Fix | Delete
* @return string Host-only URL (with scheme if available).
[521] Fix | Delete
*/
[522] Fix | Delete
public static function parse_domain( $url ) {
[523] Fix | Delete
$parsed = wp_parse_url( $url );
[524] Fix | Delete
if ( empty( $parsed['host'] ) ) {
[525] Fix | Delete
return '';
[526] Fix | Delete
}
[527] Fix | Delete
[528] Fix | Delete
if ( ! empty( $parsed['scheme'] ) ) {
[529] Fix | Delete
return $parsed['scheme'] . '://' . $parsed['host'];
[530] Fix | Delete
}
[531] Fix | Delete
[532] Fix | Delete
return '//' . $parsed['host'];
[533] Fix | Delete
}
[534] Fix | Delete
[535] Fix | Delete
/**
[536] Fix | Delete
* Drop protocol from URL (e.g., https://example.com -> //example.com).
[537] Fix | Delete
*
[538] Fix | Delete
* @since 3.3
[539] Fix | Delete
*
[540] Fix | Delete
* @param string $url URL.
[541] Fix | Delete
* @return string Protocol-relative URL.
[542] Fix | Delete
*/
[543] Fix | Delete
public static function noprotocol( $url ) {
[544] Fix | Delete
$tmp = wp_parse_url( trim( $url ) );
[545] Fix | Delete
if ( ! empty( $tmp['scheme'] ) ) {
[546] Fix | Delete
$url = str_replace( $tmp['scheme'] . ':', '', $url );
[547] Fix | Delete
}
[548] Fix | Delete
[549] Fix | Delete
return $url;
[550] Fix | Delete
}
[551] Fix | Delete
[552] Fix | Delete
/**
[553] Fix | Delete
* Validate IPv4 public address.
[554] Fix | Delete
*
[555] Fix | Delete
* @since 5.5
[556] Fix | Delete
*
[557] Fix | Delete
* @param string $ip IP address.
[558] Fix | Delete
* @return string|false IP or false when invalid.
[559] Fix | Delete
*/
[560] Fix | Delete
public static function valid_ipv4( $ip ) {
[561] Fix | Delete
return filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE );
[562] Fix | Delete
}
[563] Fix | Delete
[564] Fix | Delete
/**
[565] Fix | Delete
* Define LSCWP_DOMAIN using the home URL (no trailing slash).
[566] Fix | Delete
*
[567] Fix | Delete
* @since 1.3
[568] Fix | Delete
* @return void
[569] Fix | Delete
*/
[570] Fix | Delete
public static function domain_const() {
[571] Fix | Delete
if ( defined( 'LSCWP_DOMAIN' ) ) {
[572] Fix | Delete
return;
[573] Fix | Delete
}
[574] Fix | Delete
[575] Fix | Delete
self::compatibility();
[576] Fix | Delete
$domain = http_build_url( get_home_url(), [], HTTP_URL_STRIP_ALL ); // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url
[577] Fix | Delete
[578] Fix | Delete
define( 'LSCWP_DOMAIN', $domain );
[579] Fix | Delete
}
[580] Fix | Delete
[581] Fix | Delete
/**
[582] Fix | Delete
* Sanitize lines based on requested transforms.
[583] Fix | Delete
*
[584] Fix | Delete
* @since 1.3
[585] Fix | Delete
*
[586] Fix | Delete
* @param array|string $arr Lines as array or newline-separated string.
[587] Fix | Delete
* @param string|null $type Comma-separated transforms: uri,basename,drop_webp,relative,domain,noprotocol,trailingslash,string.
[588] Fix | Delete
* @return array|string Sanitized list or string.
[589] Fix | Delete
*/
[590] Fix | Delete
public static function sanitize_lines( $arr, $type = null ) {
[591] Fix | Delete
$types = $type ? explode( ',', $type ) : [];
[592] Fix | Delete
[593] Fix | Delete
if ( ! $arr ) {
[594] Fix | Delete
if ( 'string' === $type ) {
[595] Fix | Delete
return '';
[596] Fix | Delete
}
[597] Fix | Delete
return [];
[598] Fix | Delete
}
[599] Fix | Delete
[600] Fix | Delete
if ( ! is_array( $arr ) ) {
[601] Fix | Delete
$arr = explode( "\n", $arr );
[602] Fix | Delete
}
[603] Fix | Delete
[604] Fix | Delete
$arr = array_map( 'trim', $arr );
[605] Fix | Delete
$changed = false;
[606] Fix | Delete
if ( in_array( 'uri', $types, true ) ) {
[607] Fix | Delete
$arr = array_map( __CLASS__ . '::url2uri', $arr );
[608] Fix | Delete
$changed = true;
[609] Fix | Delete
}
[610] Fix | Delete
if ( in_array( 'basename', $types, true ) ) {
[611] Fix | Delete
$arr = array_map( __CLASS__ . '::basename', $arr );
[612] Fix | Delete
$changed = true;
[613] Fix | Delete
}
[614] Fix | Delete
if ( in_array( 'drop_webp', $types, true ) ) {
[615] Fix | Delete
$arr = array_map( __CLASS__ . '::drop_webp', $arr );
[616] Fix | Delete
$changed = true;
[617] Fix | Delete
}
[618] Fix | Delete
if ( in_array( 'relative', $types, true ) ) {
[619] Fix | Delete
$arr = array_map( __CLASS__ . '::make_relative', $arr );
[620] Fix | Delete
$changed = true;
[621] Fix | Delete
}
[622] Fix | Delete
if ( in_array( 'domain', $types, true ) ) {
[623] Fix | Delete
$arr = array_map( __CLASS__ . '::parse_domain', $arr );
[624] Fix | Delete
$changed = true;
[625] Fix | Delete
}
[626] Fix | Delete
if ( in_array( 'noprotocol', $types, true ) ) {
[627] Fix | Delete
$arr = array_map( __CLASS__ . '::noprotocol', $arr );
[628] Fix | Delete
$changed = true;
[629] Fix | Delete
}
[630] Fix | Delete
if ( in_array( 'trailingslash', $types, true ) ) {
[631] Fix | Delete
$arr = array_map( 'trailingslashit', $arr );
[632] Fix | Delete
$changed = true;
[633] Fix | Delete
}
[634] Fix | Delete
[635] Fix | Delete
if ( $changed ) {
[636] Fix | Delete
$arr = array_map( 'trim', $arr );
[637] Fix | Delete
}
[638] Fix | Delete
$arr = array_unique( $arr );
[639] Fix | Delete
$arr = array_filter( $arr );
[640] Fix | Delete
[641] Fix | Delete
if ( in_array( 'string', $types, true ) ) {
[642] Fix | Delete
return implode( "\n", $arr );
[643] Fix | Delete
}
[644] Fix | Delete
[645] Fix | Delete
return $arr;
[646] Fix | Delete
}
[647] Fix | Delete
[648] Fix | Delete
/**
[649] Fix | Delete
* Build an admin URL with action & nonce.
[650] Fix | Delete
*
[651] Fix | Delete
* Assumes user capabilities are already checked.
[652] Fix | Delete
*
[653] Fix | Delete
* @since 1.6 Changed order of 2nd&3rd param, changed 3rd param `append_str` to 2nd `type`
[654] Fix | Delete
*
[655] Fix | Delete
* @param string $action Action name.
[656] Fix | Delete
* @param string|false $type Optional type query value.
[657] Fix | Delete
* @param bool $is_ajax Whether to build for admin-ajax.php.
[658] Fix | Delete
* @param string|null|bool $page Page filename or true for admin.php.
[659] Fix | Delete
* @param array<string,string> $append_arr Extra query parameters.
[660] Fix | Delete
* @param bool $unescape Return unescaped URL.
[661] Fix | Delete
* @return string Built URL.
[662] Fix | Delete
*/
[663] Fix | Delete
public static function build_url( $action, $type = false, $is_ajax = false, $page = null, $append_arr = [], $unescape = false ) {
[664] Fix | Delete
$prefix = '?';
[665] Fix | Delete
[666] Fix | Delete
if ( '_ori' === $page ) {
[667] Fix | Delete
$page = true;
[668] Fix | Delete
$append_arr['_litespeed_ori'] = 1;
[669] Fix | Delete
}
[670] Fix | Delete
[671] Fix | Delete
if ( ! $is_ajax ) {
[672] Fix | Delete
if ( $page ) {
[673] Fix | Delete
if ( true === $page ) {
[674] Fix | Delete
$page = 'admin.php';
[675] Fix | Delete
} elseif ( false !== strpos( $page, '?' ) ) {
[676] Fix | Delete
$prefix = '&';
[677] Fix | Delete
}
[678] Fix | Delete
$combined = $page . $prefix . Router::ACTION . '=' . $action;
[679] Fix | Delete
} else {
[680] Fix | Delete
// Current page rebuild URL.
[681] Fix | Delete
$params = $_GET; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
[682] Fix | Delete
[683] Fix | Delete
if ( ! empty( $params ) ) {
[684] Fix | Delete
if ( isset( $params[ Router::ACTION ] ) ) {
[685] Fix | Delete
unset( $params[ Router::ACTION ] );
[686] Fix | Delete
}
[687] Fix | Delete
if ( isset( $params['_wpnonce'] ) ) {
[688] Fix | Delete
unset( $params['_wpnonce'] );
[689] Fix | Delete
}
[690] Fix | Delete
if ( ! empty( $params ) ) {
[691] Fix | Delete
$prefix .= http_build_query( $params ) . '&';
[692] Fix | Delete
}
[693] Fix | Delete
}
[694] Fix | Delete
global $pagenow;
[695] Fix | Delete
$combined = $pagenow . $prefix . Router::ACTION . '=' . $action;
[696] Fix | Delete
}
[697] Fix | Delete
} else {
[698] Fix | Delete
$combined = 'admin-ajax.php?action=litespeed_ajax&' . Router::ACTION . '=' . $action;
[699] Fix | Delete
}
[700] Fix | Delete
[701] Fix | Delete
$prenonce = is_network_admin() ? network_admin_url( $combined ) : admin_url( $combined );
[702] Fix | Delete
$url = wp_nonce_url( $prenonce, $action, Router::NONCE );
[703] Fix | Delete
[704] Fix | Delete
if ( $type ) {
[705] Fix | Delete
// Remove potential param `type` from url.
[706] Fix | Delete
$parsed = wp_parse_url( htmlspecialchars_decode( $url ) );
[707] Fix | Delete
$query = [];
[708] Fix | Delete
if ( isset( $parsed['query'] ) ) {
[709] Fix | Delete
parse_str( $parsed['query'], $query );
[710] Fix | Delete
}
[711] Fix | Delete
[712] Fix | Delete
$built_arr = array_merge( $query, [ Router::TYPE => $type ] );
[713] Fix | Delete
$parsed['query'] = http_build_query( array_merge( $built_arr, (array) $append_arr ) );
[714] Fix | Delete
self::compatibility();
[715] Fix | Delete
$url = http_build_url( $parsed ); // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url
[716] Fix | Delete
$url = htmlspecialchars( $url, ENT_QUOTES, 'UTF-8' );
[717] Fix | Delete
}
[718] Fix | Delete
[719] Fix | Delete
if ( $unescape ) {
[720] Fix | Delete
$url = wp_specialchars_decode( $url );
[721] Fix | Delete
}
[722] Fix | Delete
[723] Fix | Delete
return $url;
[724] Fix | Delete
}
[725] Fix | Delete
[726] Fix | Delete
/**
[727] Fix | Delete
* Check if a host is internal (same as site host or filtered list).
[728] Fix | Delete
*
[729] Fix | Delete
* @since 1.2.3
[730] Fix | Delete
*
[731] Fix | Delete
* @param string $host Host to test.
[732] Fix | Delete
* @return bool True if internal.
[733] Fix | Delete
*/
[734] Fix | Delete
public static function internal( $host ) {
[735] Fix | Delete
if ( ! defined( 'LITESPEED_FRONTEND_HOST' ) ) {
[736] Fix | Delete
if ( defined( 'WP_HOME' ) ) {
[737] Fix | Delete
$home_host = constant( 'WP_HOME' );
[738] Fix | Delete
} else {
[739] Fix | Delete
$home_host = get_option( 'home' );
[740] Fix | Delete
}
[741] Fix | Delete
define( 'LITESPEED_FRONTEND_HOST', (string) wp_parse_url( $home_host, PHP_URL_HOST ) );
[742] Fix | Delete
}
[743] Fix | Delete
[744] Fix | Delete
if ( LITESPEED_FRONTEND_HOST === $host ) {
[745] Fix | Delete
return true;
[746] Fix | Delete
}
[747] Fix | Delete
[748] Fix | Delete
if ( ! isset( self::$_internal_domains ) ) {
[749] Fix | Delete
self::$_internal_domains = apply_filters( 'litespeed_internal_domains', [] );
[750] Fix | Delete
}
[751] Fix | Delete
[752] Fix | Delete
if ( self::$_internal_domains ) {
[753] Fix | Delete
return in_array( $host, self::$_internal_domains, true );
[754] Fix | Delete
}
[755] Fix | Delete
[756] Fix | Delete
return false;
[757] Fix | Delete
}
[758] Fix | Delete
[759] Fix | Delete
/**
[760] Fix | Delete
* Check if a URL is an internal existing file and return its real path and size.
[761] Fix | Delete
*
[762] Fix | Delete
* @since 1.2.2
[763] Fix | Delete
* @since 1.6.2 Moved here from optm.cls due to usage of media.cls
[764] Fix | Delete
*
[765] Fix | Delete
* @param string $url URL.
[766] Fix | Delete
* @param string|false $addition_postfix Optional postfix to append to path before checking.
[767] Fix | Delete
* @return array{0:string,1:int}|false [realpath, size] or false.
[768] Fix | Delete
*/
[769] Fix | Delete
public static function is_internal_file( $url, $addition_postfix = false ) {
[770] Fix | Delete
if ( 'data:' === substr( $url, 0, 5 ) ) {
[771] Fix | Delete
Debug2::debug2( '[Util] data: content not file' );
[772] Fix | Delete
return false;
[773] Fix | Delete
}
[774] Fix | Delete
$url_parsed = wp_parse_url( $url );
[775] Fix | Delete
if ( isset( $url_parsed['host'] ) && ! self::internal( $url_parsed['host'] ) ) {
[776] Fix | Delete
// Check if is cdn path.
[777] Fix | Delete
if ( ! CDN::internal( $url_parsed['host'] ) ) {
[778] Fix | Delete
Debug2::debug2( '[Util] external' );
[779] Fix | Delete
return false;
[780] Fix | Delete
}
[781] Fix | Delete
}
[782] Fix | Delete
[783] Fix | Delete
if ( empty( $url_parsed['path'] ) ) {
[784] Fix | Delete
return false;
[785] Fix | Delete
}
[786] Fix | Delete
[787] Fix | Delete
// Replace child blog path for assets (multisite).
[788] Fix | Delete
if ( is_multisite() && defined( 'PATH_CURRENT_SITE' ) ) {
[789] Fix | Delete
$pattern = '#^' . PATH_CURRENT_SITE . '([_0-9a-zA-Z-]+/)(wp-(content|admin|includes))#U';
[790] Fix | Delete
$replacement = PATH_CURRENT_SITE . '$2';
[791] Fix | Delete
$url_parsed['path'] = preg_replace( $pattern, $replacement, $url_parsed['path'] );
[792] Fix | Delete
}
[793] Fix | Delete
[794] Fix | Delete
// Parse file path.
[795] Fix | Delete
if ( '/' === substr( $url_parsed['path'], 0, 1 ) ) {
[796] Fix | Delete
$docroot = isset( $_SERVER['DOCUMENT_ROOT'] ) ? sanitize_text_field( wp_unslash( $_SERVER['DOCUMENT_ROOT'] ) ) : '';
[797] Fix | Delete
if ( defined( 'LITESPEED_WP_REALPATH' ) ) {
[798] Fix | Delete
$file_path_ori = $docroot . constant( 'LITESPEED_WP_REALPATH' ) . $url_parsed['path'];
[799] Fix | Delete
} else {
[800] Fix | Delete
$file_path_ori = $docroot . $url_parsed['path'];
[801] Fix | Delete
}
[802] Fix | Delete
} else {
[803] Fix | Delete
$file_path_ori = Router::frontend_path() . '/' . $url_parsed['path'];
[804] Fix | Delete
}
[805] Fix | Delete
[806] Fix | Delete
// Optional postfix.
[807] Fix | Delete
if ( $addition_postfix ) {
[808] Fix | Delete
$file_path_ori .= '.' . $addition_postfix;
[809] Fix | Delete
}
[810] Fix | Delete
[811] Fix | Delete
$file_path_ori = apply_filters( 'litespeed_realpath', $file_path_ori );
[812] Fix | Delete
[813] Fix | Delete
$file_path = realpath( $file_path_ori );
[814] Fix | Delete
if ( ! is_file( $file_path ) ) {
[815] Fix | Delete
Debug2::debug2( '[Util] file not exist: ' . $file_path_ori );
[816] Fix | Delete
return false;
[817] Fix | Delete
}
[818] Fix | Delete
[819] Fix | Delete
return [ $file_path, (int) filesize( $file_path ) ];
[820] Fix | Delete
}
[821] Fix | Delete
[822] Fix | Delete
/**
[823] Fix | Delete
* Safely parse URL and component.
[824] Fix | Delete
*
[825] Fix | Delete
* @since 3.4.3
[826] Fix | Delete
*
[827] Fix | Delete
* @param string $url URL to parse.
[828] Fix | Delete
* @param int $component One of the PHP_URL_* constants.
[829] Fix | Delete
* @return mixed
[830] Fix | Delete
*/
[831] Fix | Delete
public static function parse_url_safe( $url, $component = -1 ) {
[832] Fix | Delete
if ( '//' === substr( $url, 0, 2 ) ) {
[833] Fix | Delete
$url = 'https:' . $url;
[834] Fix | Delete
}
[835] Fix | Delete
[836] Fix | Delete
return wp_parse_url( $url, $component );
[837] Fix | Delete
}
[838] Fix | Delete
[839] Fix | Delete
/**
[840] Fix | Delete
* Replace URLs in a srcset attribute using a callback.
[841] Fix | Delete
*
[842] Fix | Delete
* @since 2.2.3
[843] Fix | Delete
*
[844] Fix | Delete
* @param string $content HTML content containing srcset.
[845] Fix | Delete
* @param callable $callback Callback that receives old URL and returns new URL or false.
[846] Fix | Delete
* @return string Modified content.
[847] Fix | Delete
*/
[848] Fix | Delete
public static function srcset_replace( $content, $callback ) {
[849] Fix | Delete
preg_match_all( '# srcset=([\'"])(.+)\g{1}#iU', $content, $matches );
[850] Fix | Delete
$srcset_ori = [];
[851] Fix | Delete
$srcset_final = [];
[852] Fix | Delete
if ( ! empty( $matches[2] ) ) {
[853] Fix | Delete
foreach ( $matches[2] as $k => $urls_ori ) {
[854] Fix | Delete
$urls_final = explode( ',', $urls_ori );
[855] Fix | Delete
[856] Fix | Delete
$changed = false;
[857] Fix | Delete
[858] Fix | Delete
foreach ( $urls_final as $k2 => $url_info ) {
[859] Fix | Delete
$url_info_arr = explode( ' ', trim( $url_info ) );
[860] Fix | Delete
[861] Fix | Delete
$new_url = call_user_func( $callback, $url_info_arr[0] );
[862] Fix | Delete
if ( ! $new_url ) {
[863] Fix | Delete
continue;
[864] Fix | Delete
}
[865] Fix | Delete
[866] Fix | Delete
$changed = true;
[867] Fix | Delete
$urls_final[ $k2 ] = str_replace( $url_info_arr[0], $new_url, $url_info );
[868] Fix | Delete
[869] Fix | Delete
Debug2::debug2( '[Util] - srcset replaced to ' . $new_url . ( ! empty( $url_info_arr[1] ) ? ' ' . $url_info_arr[1] : '' ) );
[870] Fix | Delete
}
[871] Fix | Delete
[872] Fix | Delete
if ( ! $changed ) {
[873] Fix | Delete
continue;
[874] Fix | Delete
}
[875] Fix | Delete
[876] Fix | Delete
$urls_final = implode( ',', $urls_final );
[877] Fix | Delete
[878] Fix | Delete
$srcset_ori[] = $matches[0][ $k ];
[879] Fix | Delete
$srcset_final[] = str_replace( $urls_ori, $urls_final, $matches[0][ $k ] );
[880] Fix | Delete
}
[881] Fix | Delete
}
[882] Fix | Delete
[883] Fix | Delete
if ( $srcset_ori ) {
[884] Fix | Delete
$content = str_replace( $srcset_ori, $srcset_final, $content );
[885] Fix | Delete
Debug2::debug2( '[Util] - srcset replaced' );
[886] Fix | Delete
}
[887] Fix | Delete
[888] Fix | Delete
return $content;
[889] Fix | Delete
}
[890] Fix | Delete
[891] Fix | Delete
/**
[892] Fix | Delete
* Generate pagination HTML or return offset.
[893] Fix | Delete
*
[894] Fix | Delete
* @since 3.0
[895] Fix | Delete
*
[896] Fix | Delete
* @param int $total Total items.
[897] Fix | Delete
* @param int $limit Items per page.
[898] Fix | Delete
* @param bool $return_offset When true, return numeric offset instead of HTML.
[899] Fix | Delete
* @return int|string
[900] Fix | Delete
*/
[901] Fix | Delete
public static function pagination( $total, $limit, $return_offset = false ) {
[902] Fix | Delete
$pagenum = isset( $_GET['pagenum'] ) ? absint( $_GET['pagenum'] ) : 1; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
[903] Fix | Delete
[904] Fix | Delete
$offset = ( $pagenum - 1 ) * $limit;
[905] Fix | Delete
$num_of_pages = (int) ceil( $total / $limit );
[906] Fix | Delete
[907] Fix | Delete
if ( $offset > $total ) {
[908] Fix | Delete
$offset = $total - $limit;
[909] Fix | Delete
}
[910] Fix | Delete
[911] Fix | Delete
if ( $offset < 0 ) {
[912] Fix | Delete
$offset = 0;
[913] Fix | Delete
}
[914] Fix | Delete
[915] Fix | Delete
if ( $return_offset ) {
[916] Fix | Delete
return $offset;
[917] Fix | Delete
}
[918] Fix | Delete
[919] Fix | Delete
$page_links = paginate_links(
[920] Fix | Delete
[
[921] Fix | Delete
'base' => add_query_arg( 'pagenum', '%#%' ),
[922] Fix | Delete
'format' => '',
[923] Fix | Delete
'prev_text' => '&laquo;',
[924] Fix | Delete
'next_text' => '&raquo;',
[925] Fix | Delete
'total' => $num_of_pages,
[926] Fix | Delete
'current' => $pagenum,
[927] Fix | Delete
]
[928] Fix | Delete
);
[929] Fix | Delete
[930] Fix | Delete
return '<div class="tablenav"><div class="tablenav-pages" style="margin: 1em 0">' . $page_links . '</div></div>';
[931] Fix | Delete
}
[932] Fix | Delete
[933] Fix | Delete
/**
[934] Fix | Delete
* Build a GROUP placeholder like "(%s,%s),(%s,%s)" for a list of rows.
[935] Fix | Delete
*
[936] Fix | Delete
* @since 2.0
[937] Fix | Delete
*
[938] Fix | Delete
* @param array<int,array<int,string>> $data Data rows (values already prepared).
[939] Fix | Delete
* @param string $fields Fields CSV (only used to count columns).
[940] Fix | Delete
* @return string Placeholder string.
[941] Fix | Delete
*/
[942] Fix | Delete
public static function chunk_placeholder( $data, $fields ) {
[943] Fix | Delete
$division = substr_count( $fields, ',' ) + 1;
[944] Fix | Delete
[945] Fix | Delete
$q = implode(
[946] Fix | Delete
',',
[947] Fix | Delete
array_map(
[948] Fix | Delete
function ( $el ) {
[949] Fix | Delete
return '(' . implode( ',', $el ) . ')';
[950] Fix | Delete
},
[951] Fix | Delete
array_chunk( array_fill( 0, count( $data ), '%s' ), $division )
[952] Fix | Delete
)
[953] Fix | Delete
);
[954] Fix | Delete
[955] Fix | Delete
return $q;
[956] Fix | Delete
}
[957] Fix | Delete
[958] Fix | Delete
/**
[959] Fix | Delete
* Prepare image sizes list for optimization UI.
[960] Fix | Delete
*
[961] Fix | Delete
* @since 7.5
[962] Fix | Delete
*
[963] Fix | Delete
* @param bool $detailed When true, return detailed objects; otherwise size names.
[964] Fix | Delete
* @return array<int,string|array<string,int|string>>
[965] Fix | Delete
*/
[966] Fix | Delete
public static function prepare_image_sizes_array( $detailed = false ) {
[967] Fix | Delete
$image_sizes = wp_get_registered_image_subsizes();
[968] Fix | Delete
$sizes = [];
[969] Fix | Delete
[970] Fix | Delete
foreach ( $image_sizes as $current_size_name => $current_size ) {
[971] Fix | Delete
if ( empty( $current_size['width'] ) && empty( $current_size['height'] ) ) {
[972] Fix | Delete
continue;
[973] Fix | Delete
}
[974] Fix | Delete
[975] Fix | Delete
if ( ! $detailed ) {
[976] Fix | Delete
$sizes[] = $current_size_name;
[977] Fix | Delete
} else {
[978] Fix | Delete
$label = $current_size['width'] . 'x' . $current_size['height'];
[979] Fix | Delete
if ( $current_size_name !== $label ) {
[980] Fix | Delete
$label = ucfirst( $current_size_name ) . ' ( ' . $label . ' )';
[981] Fix | Delete
}
[982] Fix | Delete
[983] Fix | Delete
$sizes[] = [
[984] Fix | Delete
'label' => $label,
[985] Fix | Delete
'file_size' => $current_size_name,
[986] Fix | Delete
'width' => (int) $current_size['width'],
[987] Fix | Delete
'height' => (int) $current_size['height'],
[988] Fix | Delete
];
[989] Fix | Delete
}
[990] Fix | Delete
}
[991] Fix | Delete
[992] Fix | Delete
return $sizes;
[993] Fix | Delete
}
[994] Fix | Delete
}
[995] Fix | Delete
[996] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function