Categories
Coding

PowerShell Snippets for Microsoft Exchange

These are two very handy PowerShell snippets that I use again and again within our work environment.

Retreive List of All Group Members

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
csvde -f C:\report.csv -s mydomain.co.uk -r "memberof=CN=Dept:MyTartgetGroup,OU=Domain Groups,DC=mydomain,DC=ac,DC=uk" -l "sAMAccountName,name, mail"

Retreive List of All Users with Permission to Email a Group

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
Get-DistributionGroup "Dept:MyTargetGroup" | Select name,@{Name="AcceptMessagesOnlyFrom";Expression={[string]::join(";",($_.AcceptMessagesOnlyFrom | foreach {$_.Name}))}} | Export-Csv C:\report.csv
Categories
Server

SharePoint & Item-Level Permissions within Document Libraries

I have a love/hate relationship with SharePoint. Often the things that should be really simple, just aren’t. Take the “Item-level Permissions” option for instance. Every list appears to have this option (available via List Settings > Advanced Settings) except for document libraries. I’m sure the SharePoint Development Team at Microsoft have a very good reason for this…

Step forth PowerShell!

$web = Get-SPWeb http://mysharepointsite
$list = $web.Lists[“A Document Library”]
$list.ReadSecurity = 2
$list.WriteSecurity = 2
$list.Update()
$web.Dispose()

The ReadSecurity value can be one of the following:

1 = “Read all items”
2 = “Read items that were created by the user”

The “Create and Edit access” option can also be set by specifiying a value for WriteSecurity.

1 = “Create and edit all items”
2 = “Create items and edit items that were created by the user”
4 = “None”

Categories
Coding

The Post Slug

While within The Loop, WordPress provides many functions to quickly access the properties of the Post – but it doesn’t include a built-in function to get the slug for the current Post (although, admittedly, you could simply use $post->post_name).  This functionality can be easily included by adding the following two mini-functions within the functions.php file.

function get_the_slug() {
	global $post;
	return $post->post_name;
}

function the_slug() {
	echo get_the_slug();
}

Update (26 August 2012)

To be absolutely correct, to avoid possible conflicts with other core WordPress or third-party functions, the two sample functions should really be prefixed with a unique identifier, e.g. cornflowerdesign_get_the_post(). I would also recommend wrapping the functions with a function_exists() check, like so.

if ( !function_exists( 'cornflowerdesign_get_the_slug' ) ) {
	function cornflowerdesign_get_the_slug() {
		global $post;
		return $post->post_name;
	}
}
Categories
Coding

Numeric Position of Post

Just a quickie… within a WordPress loop you can easily determine the current post position via $wp_query->current_post.

<?php
while ( have_posts() ): the_post();
the_title();
echo $wp_query->current_post;
endwhile;
?>
Categories
Coding

Selecting Randon Users

Unlike the get_posts() and get_pages() functions within WordPress, get_users() doesn’t provide a way to return a random selection of users (the results can only be sorted by ‘nicename’, ’email’, ‘url’, ‘registered’, ‘display_name’, or ‘post_count’). For several projects, usually for sidebar widgets, theres been a need to return a randomly sorted sub-set of users, so I wrote the following custom function:

if ( !function_exists( 'get_random_users' ) ) {
	function get_random_users( $args = array() ) {
		$random_users = array();
		$number = 10;

		$defaults = array( 'number' => $number, 'exclude_administrators' => FALSE );
		$args = wp_parse_args( $args, $defaults );
		$number = $args['number'];

		unset( $args['number'] );

		if ( $args['exclude_administrators'] == TRUE ) {
			$administrators = get_users( array( 'role' => 'administrator' ) );

			if ( $administrators && !is_wp_error( $administrators ) ) {
				$exclude = array();

				foreach( $administrators as $user ) {
					$exclude[] = $user->ID;
				}

				$args['exclude'] = $exclude;
			}

		}

		$users = get_users( $args );

		if ( $users && !is_wp_error( $users ) ) {
			$total_users = count( $users );
			$number = ( $total_users > $number ) ? $number: $total_users;

			if ( $total_users == 1 ) {
				$random_users = $users;
			} elseif ( $total_users > 1 ) {
				shuffle( $users );
				$random_users = array_slice( $users, 0, $number );
			}

		}

		return $random_users;
	}
}

Essentially it works and accepts the same parameters as get_users(), but I have included an option that allows you to exclude Administrators from the returned array. I’m sure the code can be improved – and I probably will do when I get the chance, but for now it does the job.

Alternatively, the following two lines of code, added into the wp-includes/user.php file at line 446, would remove the need for the above function and allow ‘rand’ to be a valid value for the ‘orderby’ parameter.

} elseif ( 'rand' == $qv['orderby'] ) {
	$orderby = 'RAND()';

But I would never condone editing the core WordPress files.

Categories
Announcements

A New Look

Its taken far too long to get around to doing it, but I’ve finally developed a new WordPress theme for this website. Some aspects are still work-in-progress and I’m sure there will be a few tweaks to be made but I’m pleased with the outcome.

Categories
Coding

Querying WordPress Taxonomies

To produce a mega-menu for a recent WordPress project, I had a requirement to show all the terms within one taxonomy that were associated with Posts that a specific term from a second taxonomy was also associated with. Tricky. It took a little while to get my head around the problem, but I came up with a solution that did just what was needed.

if ( !function_exists( 'get_associated_terms' ) ) {
	function get_associated_terms( $taxonomy_slug, $term_id = 0, $post_type = 'post' ) {
		global $wpdb;

		$sql = "SELECT DISTINCT $wpdb->terms.term_id, $wpdb->terms.name, $wpdb->terms.slug, $wpdb->terms.term_group, $wpdb->term_taxonomy.term_taxonomy_id, $wpdb->term_taxonomy.taxonomy, $wpdb->term_taxonomy.description, $wpdb->term_taxonomy.parent, $wpdb->term_taxonomy.count
			FROM $wpdb->terms
			INNER JOIN $wpdb->term_taxonomy ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id
			INNER JOIN $wpdb->term_relationships ON $wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id
			INNER JOIN $wpdb->posts ON $wpdb->term_relationships.object_id = $wpdb->posts.ID
			INNER JOIN $wpdb->term_relationships tr2 ON $wpdb->posts.ID = tr2.object_id
			INNER JOIN $wpdb->term_taxonomy tt2 ON tr2.term_taxonomy_id = tt2.term_taxonomy_id
			WHERE $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = %s AND $wpdb->term_taxonomy.taxonomy = %s AND tt2.term_id = %d
			ORDER BY $wpdb->terms.name";

		$safe_sql = $wpdb->prepare( $sql, $post_type, $taxonomy_slug, $term_id );
		$results = $wpdb->get_results( $safe_sql, OBJECT );

		return $results;
	}
}

Once added to the WordPress theme functions.php file or a plugin, its used in the same way you’d use one of the built-in functions, like get_terms(), except my function accepts fewer parameters. It returns an Object that can be looped through in the normal way.

$terms = get_associated_terms( 'tax1', 256 );

foreach($terms as $term) {
	echo '<a href="/tax1/' . $term->slug . '" class="' . $term->taxonomy . '">' . $term->name . '</a>';
}

The first parameter in the function is the name of the taxonomy you wish to return. The second parameter is the ID of a term within your starting taxonomy. Running my example would return an Object containing all terms within the ‘tax1’ taxonomy which are assigned to Posts that also have term 256 assigned to them.

Categories
Design & UI

Social Media Logos and Branding

I love it when companies and social media services provide clear branding guidelines – especially when it comes down to how you may or many not use their logos. It removes any ambiguity.

I’ve compiled a short list of direct links to guidelines that, I’m sure, I will be referring to time and again…

The following aren’t social media related but are still handy for future reference…

Categories
Coding

Getting a list of all files

I do like PowerShell. Something that used to take 10-20 lines of VBS code, such as generating a report of all files stored within a folder, can now be reduced to a single line.

Get-ChildItem "X:\Software" -recurse | Select-Object Name, Extension, Length, CreationTime, LastWriteTime, Fullname | Export-CSV "D:\File Report.csv"

Categories
Announcements

Research to Action

I’ve just uploaded a new website, Research to Action. Commissioned by CommsConsult and designed by Liminal Design, this is one of the more in-depth WordPress-based sites that I’ve developed – requiring the creation of a new theme and several new plugins and widgets. There’s still a little tweaking and user-testing to do, but I’m happy with the result so far.