WooCommerce – Conditional Ship to a Different Address Selection

October 31, 2017 (3 years ago)
WooCommerce, WordPress, JS, Functions

The scenario is this:

The site has multiple shipping methods (multiple client locations, and the option to ship to “Other”.)

I wanted to show the address panel if “Other” location was chosen, and hide the “Ship to Another Location”  option heading on the shipping page if a client location was chosen.

None of this was strictly necessary, but it makes for a smoother customer experience.

This went into my functions.php file.

/* added with my other enqueued scripts */
   wp_register_script( 'hideshipto', get_bloginfo( 'stylesheet_directory' ) . '/hide_ship_to.js', array( 'jquery' ) );


add_action( 'init', 'fb_ship_to_open' ); // opens the ship to for church dlievery or hides the ship to a different address for all others
function fb_ship_to_open () {
  global $woocommerce;
    if ( !is_admin() && WC()->session->get( 'chosen_shipping_methods' ) ) {
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping = $chosen_methods[0]; 
      if ('your_shipping_method_goes_here' == $chosen_shipping ) {
        add_filter( 'woocommerce_ship_to_different_address_checked', '__return_true' );
      } else {
        add_action( 'wp_enqueue_scripts', 'fb_load_ship_script' );
          function fb_load_ship_script() {
        wp_enqueue_script( 'hideshipto');
        }
      }
    }
  }

Then, this is the hide_ship_to.js script file. (uploaded to the theme directory)

jQuery( document ).ready(function($) {
    $('#ship-to-different-address').hide();
});

 

A Simple jQuery Accordion

February 27, 2017 (4 years ago)
JS, Functions

No need for the overhead of a plugin.

In this case, I have a custom post type for FAQs, where the title is the question, and the content is the answer.

This script hides all the answers until one of the questions is clicked.

Here’s the JavaScript:

<script type="text/javascript">
    jQuery(document).ready(function($) {
        $('.accordion').on('click', function() {
            $parent_box = $(this).closest('.faqbox');
            $parent_box.siblings().find('.panel').hide();
            $parent_box.find('.panel').toggle();
        });
    });
</script>

And the HTML:

<?php while ( have_posts() ) : the_post(); ?>

     <div class="faqbox">
          <h4 class="accordion"><i class="fa fa-plus-square" aria-hidden="true"></i> <?php the_title(); ?></h4>
          <div class="panel"><?php the_content(); ?></div>
     </div>

<?php    endwhile; ?>

 

Then, this little bit of CSS brings it together:

.faqbox { margin: 1em 0 0;
  .panel { display: none;  margin-left: 1em; }
  .accordion { cursor:pointer; }
}

 

Change the Text of Reset Password Email

September 25, 2016 (4 years ago)
WordPress, PHP, Functions

Send a custom message to users who request a password re-set:

//* Password reset activation E-mail -> Body
add_filter( 'retrieve_password_message', 'dnlt_retrieve_password_message', 10, 2 );

function dnlt_retrieve_password_message( $message, $key ){
    $user_data = '';
    // If no value is posted, return false
    if( ! isset( $_POST['user_login'] )  ){
            return '';
    }
    // Fetch user information from user_login
    if ( strpos( $_POST['user_login'], '@' ) ) {

        $user_data = get_user_by( 'email', trim( $_POST['user_login'] ) );
    } else {
        $login = trim($_POST['user_login']);
        $user_data = get_user_by('login', $login);
    }
    if( ! $user_data  ){
        return '';
    }
    $user_login = $user_data->user_login;
    $user_email = $user_data->user_email;
    // Setting up message for retrieve password
    $message = "A password reset has been requested for this site:\n\n";
    $message .= network_home_url( '/' ) . "\r\n\r\n";
    $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";  
    $message .= "Change this text to whatever you like.\n\n";
    $message .= "If you did not request this, just ignore this email and nothing will happen.\n\n"; 
    $message .= "To reset your password, visit the following address:\n";
    $message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login');
    
    return $message;
}

 

Remove WP Version Number

September 23, 2016 (4 years ago)
WordPress, Best Practices, Functions

Prevent robot scrapers from easily finding out which version of WordPress you’re running.

Not a substitute for keeping WP updated, but a handy fallback for clients who may not.

/* remove WP version number */
if ( ! function_exists( 'dnlt_remove_wp_version' ) ) {
    add_filter( 'the_generator', 'dnlt_remove_wp_version' );

    function dnlt_remove_wp_version() {
        return '';
    }
}

 

Create Admin User via FTP

July 9, 2016 (4 years ago)
Functions

When you are locked out of your WordPress site and have no access to PHPMyAdmin, add this to your functions.php file to create a new admin user account.

Remove it from the functions file after you’re successfully logged in. (The user will remain.)

function wpb_admin_account(){
   $user = 'Username';
   $pass = 'Password';
   $email = 'email@domain.com';
   if ( !username_exists( $user )  && !email_exists( $email ) ) {
      $user_id = wp_create_user( $user, $pass, $email );
      $user = new WP_User( $user_id );
      $user->set_role( 'administrator' );
} }
add_action('init','wpb_admin_account');

Thanks for the snippet, WPBeginner!

Adding Content to the Admin Edit Screen

October 30, 2015 (5 years ago)
WordPress, Functions

When creating custom post types, you often need custom fields for them. In the past, your options were “normal” or “side” with priorities. Depending on what else is displayed on your edit screen, these boxes could vary in where they appeared.

And sometimes you just need to add a comment or note to the edit pages.

Good News! We now have new hooks to place them precisely:

add_action( 'edit_form_top', 'myprefix_edit_form_top' );
function myprefix_edit_form_top() {
    echo '<h2>This is edit_form_top!</h2>';
}

add_action( 'edit_form_after_title', 'myprefix_edit_form_after_title' );
function myprefix_edit_form_after_title() {
    echo '<h2>This is edit_form_after_title!</h2>';
}
 
add_action( 'edit_form_after_editor', 'myprefix_edit_form_after_editor' );
function myprefix_edit_form_after_editor() {
    echo '<h2>This is edit_form_after_editor!</h2>';
}
 
add_action( 'edit_form_advanced', 'myprefix_edit_form_advanced' );
function myprefix_edit_form_advanced() {
    echo '<h2>This is ye olde edit_form_advanced!</h2>';
}

Here’s an article that explains the usage: https://make.wordpress.org/core/2012/12/01/more-hooks-on-the-edit-screen/

 

Append Item to Nav Menu

July 8, 2015 (5 years ago)
WordPress, Functions

Programmatically add an item to any menu that is called with wp_nav_menu.

add_filter('wp_nav_menu_items', 'add_admin_link', 10, 2);

function add_admin_link($items, $args){

    if( $args->theme_location == 'footer_menu' ){

        $items = $items . '<li><a title="Admin" href="'. esc_url( admin_url() ) .'">' . __( 'Admin' ) . '</a></li>';

    }

    return $items;

}

Thanks, Micah Wood! https://gist.github.com/wpscholar/1249995

Debugging Scripts in the Console

June 29, 2015 (5 years ago)
PHP, Functions

The easiest way to see what data is being used inside a script. Add this script to your page (or in functions.php for sitewide use).

function debug_to_console( $data ) {

    if ( is_array( $data ) )
        $output = "<script>console.log( 'Debug Objects: " . implode( ',', $data) . "' );</script>";
    else
        $output = "<script>console.log( 'Debug Objects: " . $data . "' );</script>";

    echo $output;
}

Then call it inside your function like this:

debug_to_console($mydata);

Then just look at your console log to see the output.

Hint: if you are tracking one variable through a script and want to see how it changes, try something like this:

debug_to_console('step 1 -' . $mydata);

 

Remove Emoji Support from WordPress 4.2

May 19, 2015 (5 years ago)
WordPress, JS, Functions

4.2 added the ability to use Emojicons in WP posts. If you don’t use them, you can remove the (unnecessary) scripts this adds to the header on all your site pages. Here’s the code for your functions.php file:

function pw_remove_emojicons() 
{
    // Remove from comment feed and RSS
    remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
    remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );

    // Remove from emails
    remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );

    // Remove from head tag
    remove_action( 'wp_head', 'print_emoji_detection_script', 7 );

    // Remove from print related styling
    remove_action( 'wp_print_styles', 'print_emoji_styles' );

    // Remove from admin area
    remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
    remove_action( 'admin_print_styles', 'print_emoji_styles' );
}
add_action( 'init', 'pw_remove_emojicons' );

 Thank you, Paulund!

http://www.paulund.co.uk/disable-emojicons-introduced-in-wordpress-4-2

Allow Multiple User Emails

December 23, 2014 (6 years ago)
WordPress, Functions

Ever need to allow your users to have non-unique email addresses? (i.e. two user accounts with the same email address)

Here’s the function:

add_filter('pre_user_email', 'skip_email_exist');
function skip_email_exist($user_email){
    define( 'WP_IMPORTING', 'SKIP_EMAIL_EXIST' );
    return $user_email;
}

 

Next »

Skip to toolbar