Forces WWW & SSL

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ https://www.domain.com/$1 [L,R=301]

Custom Styling Select Box

Custom Styling Select boxes is a pain. This makes it easier

http://jsfiddle.net/BB3JK/47/





body {
padding:50px;
background-color:white;
}
.s-hidden {
visibility:hidden;
padding-right:10px;
}
.select {
cursor:pointer;
display:inline-block;
position:relative;
font:normal 11px/22px Arial, Sans-Serif;
color:black;
border:1px solid #ccc;
}
.styledSelect {
position:absolute;
top:0;
right:0;
bottom:0;
left:0;
background-color:white;
padding:0 10px;
font-weight:bold;
}
.styledSelect:after {
content:"";
width:0;
height:0;
border:5px solid transparent;
border-color:black transparent transparent transparent;
position:absolute;
top:9px;
right:6px;
}
.styledSelect:active, .styledSelect.active {
background-color:#eee;
}
.options {
display:none;
position:absolute;
top:100%;
right:0;
left:0;
z-index:999;
margin:0 0;
padding:0 0;
list-style:none;
border:1px solid #ccc;
background-color:white;
-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);
-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);
box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);
}
.options li {
padding:0 6px;
margin:0 0;
padding:0 10px;
}
.options li:hover {
background-color:#39f;
color:white;
}


// Iterate over each select element
$('select').each(function () {

// Cache the number of options
var $this = $(this),
numberOfOptions = $(this).children('option').length;

// Hides the select element
$this.addClass('s-hidden');

// Wrap the select element in a div
$this.wrap('

');

// Insert a styled div to sit over the top of the hidden select element
$this.after('

');

// Cache the styled div
var $styledSelect = $this.next('div.styledSelect');

// Show the first select option in the styled div
$styledSelect.text($this.children('option').eq(0).text());

// Insert an unordered list after the styled div and also cache the list
var $list = $('

    ', {
    'class': 'options'
    }).insertAfter($styledSelect);

    // Insert a list item into the unordered list for each select option
    for (var i = 0; i < numberOfOptions; i++) { $('

  • ', {
    text: $this.children('option').eq(i).text(),
    rel: $this.children('option').eq(i).val()
    }).appendTo($list);
    }

    // Cache the list items
    var $listItems = $list.children('li');

    // Show the unordered list when the styled div is clicked (also hides it if the div is clicked again)
    $styledSelect.click(function (e) {
    e.stopPropagation();
    $('div.styledSelect.active').each(function () {
    $(this).removeClass('active').next('ul.options').hide();
    });
    $(this).toggleClass('active').next('ul.options').toggle();
    });

    // Hides the unordered list when a list item is clicked and updates the styled div to show the selected list item
    // Updates the select element to have the value of the equivalent option
    $listItems.click(function (e) {
    e.stopPropagation();
    $styledSelect.text($(this).text()).removeClass('active');
    $this.val($(this).attr('rel'));
    $list.hide();
    /* alert($this.val()); Uncomment this for demonstration! */
    });

    // Hides the unordered list when clicking outside of it
    $(document).click(function () {
    $styledSelect.removeClass('active');
    $list.hide();
    });

    });

Amazon Lightsail WordPress Bitnami SFTP Permission Denied Error

After setting up new Lighstail instances I realized I was having a bunch of trouble transferring files via SFTP. Turns out files/folders created by Apache can’t be modified. So one needs to adjust permissions for SFTP to work properly. Here are a couple of commands taken from the Bitnami forums that can help:


sudo chown -R bitnami:daemon /opt/bitnami/apps/wordpress/htdocs/wp-content
sudo chmod -R g+w /opt/bitnami/apps/wordpress/htdocs/wp-content

Useful Guide to Sorting Query Results by Multiple Meta Keys

Great post on how to sort query results by Multiple Keys:

https://www.billerickson.net/wp-query-sort-by-meta/

Code for Reference:

<?php

// Query Arguments
$args = array( 
	'post_type'       => 'review',
	'posts_per_page'  => 10,
	'paged'           => get_query_var( 'paged', false ),
	'meta_query'      => array(
		'relation'    => 'AND',
		'be_top_pick' => array(
			'key'     => 'be_top_pick',
			'compare' => 'EXISTS',
		),
		'be_price'    => array(
			'key'     => 'be_price',
			'type'    => 'NUMERIC',
			'compare' => 'EXISTS',
		),
		'be_rating'   => array(
			'key'     => 'be_rating',
			'type'    => 'NUMERIC',
			'compare' => 'EXISTS',
		),
	)
);

// Sort Results
$current_sort = isset( $_GET['hosting-sort'] ) ? esc_attr( $_GET['hosting-sort'] ) : 'most-recent';	
switch( $current_sort ) {

	case 'most-recent':
		$args['orderby']  = array( 
			'be_top_pick' => 'DESC',
			'post_date'   => 'DESC',
		);
		break;
		
	case 'price-high':
		$args['orderby'] = array(
			'be_top_pick' => 'DESC',
			'be_price'    => 'DESC',
		);
		break;
		
	case 'price-low':
		$args['orderby'] = array(
			'be_top_pick' => 'DESC',
			'be_price'    => 'ASC',
		);
		break;
		
	case 'rating-high':
		$args['orderby'] = array(
			'be_top_pick' => 'DESC',
			'be_rating'   => 'DESC',
		);
		break;
		
	case 'rating-low':
		$args['orderby'] = array(
			'be_top_pick' => 'DESC',
			'be_rating'   => 'ASC',
		);
		break;
}

$loop = new WP_Query( $args );

Setting up Let’s Encypt SSL for Amazon Lightsail

These are the best guides:

  • Setting up the cert: https://metablogue.com/enable-lets-encrypt-ssl-aws-lightsail/
  • Setting up the chron job to renew the cert: https://medium.com/unicorn-supplies/ssl-for-aws-lightsail-wordpress-8053359a774f
  • Test the cert: https://www.ssllabs.com/ssltest/

Amazon Lightsail WordPress Initial Setup Common Tasks

I use the following commands all the time when setting up a new Amazon Lightsail WordPress Instance and I can never remember them.

Disable the Bitnami Banner

sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1

Get the Password

cat bitnami_application_password