Skip to content

Instantly share code, notes, and snippets.

View sabrina-zeidan's full-sized avatar

Sabrina Zeidan sabrina-zeidan

View GitHub Profile
@sabrina-zeidan
sabrina-zeidan / list_transients_by_prefix.php
Created December 22, 2023 12:43
List or delete all transients with a specific prefix WordPress
function delete_transients_with_prefix( $prefix ) {
foreach ( get_transient_keys_with_prefix( $prefix ) as $key ) {
// delete_transient( $key );
echo "<br>". $key." ".get_transient( $key );
}
}
/**
* Gets all transient keys in the database with a specific prefix.
*
@sabrina-zeidan
sabrina-zeidan / list_all_hooks.php
Created December 20, 2023 15:38
List all hooks firing in the order [WordPress]
//This goes in functions.php or plugin file or wherever
function dump_hook( $tag, $hook ) {
ksort($hook);
echo "<pre>>>>>>\t$tag<br>";
foreach( $hook as $priority => $functions ) {
echo $priority;
@sabrina-zeidan
sabrina-zeidan / .hatccess
Created September 27, 2023 08:33
webp redirection on nexcess servers
RewriteEngine On
# Check if the request is for a PNG or JPEG file
RewriteCond %{REQUEST_FILENAME} \.(png|jpe?g)$
# Check if a WebP version of the file exists
RewriteCond %{REQUEST_FILENAME}.webp -f
# Redirect to the WebP version of the file
RewriteRule ^(.+)\.(png|jpe?g)$ $1.$2.webp [NC,L]
@sabrina-zeidan
sabrina-zeidan / test_queries_time.php
Last active February 12, 2024 19:06
Performance of a few common database queries [WordPress]
//Measure performance of some WP funcitons
$startTime = microtime(true);
$guarded_pages = get_posts([
'posts_per_page' => 100,
'no_found_rows' => true,
'post_type' => SpeedGuard_Admin::$cpt_name,
'post_status' => 'publish',
'fields' => 'ids'
] );
@sabrina-zeidan
sabrina-zeidan / sz_repeat_purchase_wtf.php
Last active February 23, 2023 01:20
Disable repeat purchase WooCommerce [WordPress]
/** Disable repeat purchase V 22.20 7:40 -- on Adding to Cart check **/
add_filter( 'woocommerce_add_to_cart_validation', 'limit_cart_items_from_category', 10, 5 );
function limit_cart_items_from_category ( $passed, $product_id, $quantity, $variation_id = 0, $variations = null ){
$current_product_id = ($variation_id === 0) ? $product_id : $variation_id;
// Loop through cart items checking if the product is already in cart
foreach ( WC()->cart->get_cart() as $cart_item ){
if( $cart_item['data']->get_id() == $current_product_id ) {
wc_add_notice( __('This product is already in your cart.', 'woocommerce' ), 'error' );
return false;
@sabrina-zeidan
sabrina-zeidan / webp_for_site.conf
Last active January 9, 2023 19:43
Serve WebP without plugin straight from the server
upstream php {
{{#each fastcgi_servers}}
server {{this}};
{{/each}}
}
# SZ START
# Check if client is capable of handling webp
map $http_accept $webp_suffix {
default "";
@sabrina-zeidan
sabrina-zeidan / generate_alt_from_title.php
Created October 2, 2022 20:50
Generate image alt from the post title -- for the first image in the post [WordPress]
// Generate image alt from the post title -- for the first image in the post
add_filter('the_content', 'add_alt_tags', 99999);
function add_alt_tags($content) {
global $post;
preg_match_all('/<img[^>]+>/i', $content, $images);
if(!is_null($images)) {
foreach($images[0] as $index => $value) {
//If no alt
// if(!preg_match('/alt=/', $value)) {
$new_img = str_replace('<img', '<img alt="'.get_the_title().'"', $images[0][$index]);
@sabrina-zeidan
sabrina-zeidan / stop_loading_blocks_crap_fse.php
Last active May 3, 2023 21:34
Stop loading block's CSS and JS if the block is not used -- for Full Site Edit themes [WordPress]
// Avoid loading unused assets, both JS and CSS
// Removes both CSS and JS
// For Full Site Editing Theme!
// In a better world block's author makes sure the block's assests are loaded only if block is actually in use (via enqueue_block_assets). For other cases we can do it ourselves
// In this example I load Swiper's block assets only where the block is used
// TODO: Works for content on Singular content only. if block is elsewhere or it's archive use this https://wordpress.stackexchange.com/questions/392493/find-if-widget-block-is-active
add_filter( 'style_loader_tag', 'sz_stop_loading_unused_block_crap', 9999, 3 );
add_filter( 'script_loader_tag', 'sz_stop_loading_unused_block_crap', 10, 3 );
function sz_stop_loading_unused_block_crap( $tag, $handle, $src ) {
@sabrina-zeidan
sabrina-zeidan / avoid_loading_unused_assets.php
Created September 29, 2022 00:20
Do not load unused assets [WordPress]
//Do not load plugins' scripts and styles on every page - only where they are in use
add_filter( 'style_loader_tag', 'sz_stop_loading_unused_styles', 10, 2 ); // *doesn't works with 3 arguments
function sz_stop_loading_unused_styles( $tag, $handle) {
if (!is_user_logged_in()){// for FE only
if (is_singular('post')) {// for Posts only
//entire plugin
if (str_contains($tag, 'woocommerce')) $tag = '';
//specific handle
//Gutenberg
if (in_array( $handle, ['wc-blocks-style', 'wp-block-editor', 'wp-editor', 'wp-block-library', 'wp-components'])) $tag = '';
@sabrina-zeidan
sabrina-zeidan / get_acf_block_data.php
Last active April 30, 2024 06:14
Get ACF field value from Gutenberg block [WordPress]
// Get ACF value whetherit comes from regular ACF or ACF block
// Useful if you need to access ACF fileds that are in block as regular fields
// Usage: get_acf_block_data($post, 'acf/talk-description', 'talk_description' )
function get_acf_block_data($post, $block_name = 'acf/default-block-name', $field_name = "" ){
$content = "";
if ( has_blocks( $post->post_content ) && !empty($field_name )) {
$blocks = parse_blocks( $post->post_content );
foreach($blocks as $block){
if ( $block['blockName'] === $block_name ) {
if(isset($block["attrs"]["data"][$field_name ])){