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 / filter_wp_scripts_via_hook.php
Last active September 6, 2022 06:23
To move third-party JS out of the head seamlessly
//add_action( 'wp_print_scripts', 'sz_enqueue_scripts', 10); //run later or via wp_print_scripts ot catch all scripts
add_action( 'wp_enqueue_scripts', 'sz_enqueue_scripts', 999);
function sz_enqueue_scripts(){
global $wp_scripts;
//change dependency to load earlier
$handles_to_filter = array('dt-above-fold');
$dependency_handle_to_add = 'wpb_composer_front_js'; //TODO: accept array
foreach ($handles_to_filter as $handle_to_filter){
foreach( $wp_scripts->registered as $script_object) { //find script in registered by handle
if ($script_object->handle == $handle_to_filter){
@sabrina-zeidan
sabrina-zeidan / empty_plugin_with_a_search_field.php
Created March 27, 2021 12:39
Empty plugin with a search field for WP REST API tut
<?php
/**
* Plugin Name: SZ WP REST API Tutorial
* Description: It's an example of WP REST API usage for search with autocomplete with vanilla JS
* Plugin URI:
* Author: Sabrina Zeidan
* Author URI: https://sabrinazeidan.com
* License: GNU General Public License v2 or later
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
*
@sabrina-zeidan
sabrina-zeidan / optimize_a2a.php
Created January 27, 2021 20:08
Optimize Add2Any loading it's styles and scripts
//This filters display, but CSS and JS are still loaded
add_filter( 'addtoany_script_disabled', 'addtoany_disable_display' );
function addtoany_disable_display($script_disabled) {
if ( is_front_page() || is_archive() ) {
return true;
} else {
return $script_disabled;
}
}
@sabrina-zeidan
sabrina-zeidan / acf_sync_with_user_profile.php
Last active July 24, 2024 18:11
When you have ACF User fields like first name and last name and you need to keep that in sync with what is entered in WordPress user profile (works both ways)
//If both changed at the same time - custom field value will be applied as it fires later, set 30 to change it add_action( 'profile_update', array($this, 'update_acf_fields'), 30, 2 );
class Sync_ACF_with_User_Profile_Class {
static public $sync_pair = array(
array( 'acf' => 'member_name', 'profile_field' => 'first_name'), //add acf field name according to your setup
array( 'acf' => 'member_lastname', 'profile_field' => 'last_name')// add more rows to sync any other fields as well
);
public function __construct() {
add_action( 'profile_update', array($this, 'update_acf_fields'), 10, 2 ); //when profile is updated -> update ACF
add_action('updated_user_meta', array($this, 'update_user_profile_fields'),10,4); // when ACF is updated -> update profile
add_action('added_user_meta', array($this, 'update_user_profile_fields'),10,4); // when ACF is added -> update profile
@sabrina-zeidan
sabrina-zeidan / acf_get_user_fields.php
Created November 13, 2020 20:54
Get all ACF's assigned to user profile
// get all field groups that have location User Add/Edit Form
$field_groups = acf_get_field_groups(array( 'user_form' => 'edit'));
$all_fields = array();
foreach ($field_groups as $field_group){
$fields = acf_get_fields($field_group['key']);
$all_fields = array_merge($all_fields, $fields); //get all user's fields together
}
@sabrina-zeidan
sabrina-zeidan / acf_in_shortcode.php
Created October 15, 2020 16:11
ACF form inside a shortcode (buffering) otherwise broken XML sitemaps, headers already sent etc
add_shortcode( 'acf_registration', 'acf_registration' );
function acf_registration() {
$args = array(); //arguments here
ob_start();
acf_form( $args );
$registration_form = ob_get_contents();
ob_end_clean();
return $registration_form;
@sabrina-zeidan
sabrina-zeidan / hide-child-if-parent-has-another.js
Created September 18, 2020 08:31
Hide child if parent has (not) another child with class [JS]
//<div class="elementor-column"><div class="dce-acf-repater-"><div class="repeater-item"></div></div><div class="elementor-widget-button"></div></div>
(function( $ ){
$(".elementor-column .dce-acf-repater-").each(function() {
if (!$(this).has(".repeater-item").length) {
hide = $(this).closest('.elementor-column').find(".elementor-widget-button").hide();
}
});
})(jQuery);
@sabrina-zeidan
sabrina-zeidan / filter_elementor_query_by_acf.php
Created September 18, 2020 08:27
Filter Elementor query by ACF [WordPress]
//custom-query-name is set in Elementor as query ID
add_action( 'elementor/query/custom-query-name', function( $query ) {
$meta_query = (array)$query->get('meta_query');
$meta_query[] = array(
'key' => 'custom_field',
'value' => '',
'compare' => '!=',
);
$query->set('meta_query',$meta_query);
} );
@sabrina-zeidan
sabrina-zeidan / wp_query_wrapper.php
Created September 6, 2020 19:41
Html wrapper for WP_Query (insert text before or after the loop)
<?php
//Handy when CPT previews are used in different templates across the site
add_action( 'loop_start', 'recipes_loop_start' );
function recipes_loop_start( $query ){
if ( !$query->is_main_query() && $query->get('post_type')== 'recipe' && !is_admin()) echo "<ul class='recipes-preview'>";
}
add_action( 'loop_end', 'recipes_loop_end' );
function recipes_loop_end( $query ){
if ( !$query->is_main_query() && $query->get('post_type')== 'recipe' && !is_admin()) echo "</ul>";
@sabrina-zeidan
sabrina-zeidan / get_slug.php
Last active July 20, 2020 12:36
Get post/term slug from any type of URL
<?php
//Examples of input
$input = "http://www.example.com/cat/cat-child/slug/";
$input = "http://www.example.com/cat/slug";
$input = "http://www.example.com/cat/slug/";
$input = "http://www.example.com/cat/slug/?dsss&efsdc=dc";
//This line will always return "slug"
$slug = basename(strtok(str_replace(' ', '', htmlspecialchars($input )), '?')).PHP_EOL;
echo $slug;
//Useful for further use with get_term_by('slug', $slug, $tax);