Complex Requirements
Simple,
Measurable Results
Making WordPress do what you need, not what it wants.
Clean Code
Featured Projects
Shared Vision
Clear communication helps align diverse perspectives. Whether sketching strategies or mapping next steps, I value using visuals and teamwork to build momentum.
Insight in Action
Turning raw data into meaningful direction through open discussion and analysis.
Ideas in Motion
Innovation doesn’t wait for the boardroom. Sharing ideas on the move keeps projects agile, conversations fresh, and solutions practical.
Focused Execution
Where planning meets precision — collaborating hands-on to ensure accuracy and results.
Interactive Card Stack
The client needed a clear, engaging way to present information, and the UX designer proposed an interactive card stack. I implemented the design by solving challenges with z-index, transitions, and transforms, delivering a dynamic, layered experience that makes content easy and fun to explore.
Code Review
<?php
/**
* Course Catalog Loop Block
* Version: 3.1 - Server-side rendering (no AJAX)
*/
$args = [
'post_type' => 'course',
'posts_per_page' => -1,
'orderby' => 'title',
'order' => 'ASC',
'post_status' => 'publish'
];
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<div class="course-grid">';
while ($query->have_posts()) {
$query->the_post();
$post_id = get_the_ID();
$title = esc_html(get_the_title());
$summary = get_field('summary_text', $post_id);
$details = get_field('additional_details', $post_id);
$custom_link = get_field('custom_link', $post_id);
$custom_link_url = $custom_link['url'] ?? '';
$custom_link_label = $custom_link['title'] ?? 'Learn More';
?>
<article class="course-card" data-course-id="<?php echo $post_id; ?>">
<h2><?php echo $title; ?></h2>
<?php if ($summary): ?>
<div class="summary-text"><?php echo wp_kses_post($summary); ?></div>
<?php endif; ?>
<?php if ($details): ?>
<div class="additional-details"><?php echo wp_kses_post($details); ?></div>
<?php endif; ?>
<?php if ($custom_link_url): ?>
<p><a class="custom-link" href="<?php echo esc_url($custom_link_url); ?>" target="_blank" rel="noopener"><?php echo esc_html($custom_link_label); ?></a></p>
<?php endif; ?>
<?php
// Display ACF taxonomy tags
$custom_taxonomies = get_field('custom_taxonomies', $post_id);
if ($custom_taxonomies && is_array($custom_taxonomies)):
?>
<div class="acf-taxonomy-tags">
<?php foreach ($custom_taxonomies as $taxonomy_group):
// Ensure taxonomy_group is an array
if (!is_array($taxonomy_group)) continue;
?>
<div class="taxonomy-group">
<?php if (!empty($taxonomy_group['taxonomy_text'])): ?>
<h4 class="taxonomy-header"><?php echo esc_html($taxonomy_group['taxonomy_text']); ?></h4>
<?php endif; ?>
<?php
// Check if terms exists and is an array
if (!empty($taxonomy_group['terms']) && is_array($taxonomy_group['terms'])):
foreach ($taxonomy_group['terms'] as $term):
// Ensure term is an array
if (!is_array($term)) continue;
?>
<div class="term-tag-group">
<?php
$term_name = $term['term_name'] ?? '';
$term_color = $term['term_tile_color'] ?? '#ccc';
if ($term_name):
?>
<span class="term-tag" style="background-color: <?php echo esc_attr($term_color); ?>">
<?php echo esc_html($term_name); ?>
</span>
<?php endif; ?>
<?php
// Check if sub_terms exists and is an array
if (!empty($term['sub_terms']) && is_array($term['sub_terms'])): ?>
<div class="sub-term-tags">
<?php foreach ($term['sub_terms'] as $sub_term):
// Ensure sub_term is an array
if (!is_array($sub_term)) continue;
$sub_name = $sub_term['sub_term_name'] ?? '';
$sub_color = $sub_term['sub_term_tile_color'] ?? '#eee';
if ($sub_name):
?>
<span class="sub-term-tag" style="background-color: <?php echo esc_attr($sub_color); ?>">
<?php echo esc_html($sub_name); ?>
</span>
<?php endif; ?>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
<?php endforeach;
endif; ?>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</article>
<?php
}
echo '</div>';
wp_reset_postdata();
} else {
echo '<div class="course-grid"><p class="no-courses">No courses found.</p></div>';
}
?>

Course Catalog
Previously, grade levels had individual static course pages with no interactivity. The client wanted a single catalog with filters and search that editors could update easily. I built a custom options page for courses and a plugin to handle AJAX filtering, allowing users to refine results instantly without page reloads. View the catalog here.
Course Catalog Code
// Function to extract and normalize grade level from custom taxonomies
if (!function_exists('extract_grade_level')) {
function extract_grade_level($custom_taxonomies) {
if (!$custom_taxonomies || !is_array($custom_taxonomies)) return [999, 'Unknown'];
foreach ($custom_taxonomies as $taxonomy_group) {
if (!is_array($taxonomy_group)) continue;
$taxonomy_text = strtolower($taxonomy_group['taxonomy_text'] ?? '');
// Look for grade-related taxonomy (flexible keywords)
if (strpos($taxonomy_text, 'grade') !== false || strpos($taxonomy_text, 'level') !== false) {
$term_name = $taxonomy_group['term_name'] ?? '';
// Check sub-terms first (more specific grades)
if (!empty($taxonomy_group['sub_terms']) && is_array($taxonomy_group['sub_terms'])) {
foreach ($taxonomy_group['sub_terms'] as $sub_term) {
if (!is_array($sub_term)) continue;
$sub_name = $sub_term['sub_term_name'] ?? '';
$sort_value = normalize_grade_for_sorting($sub_name);
if ($sort_value !== 999) {
return [$sort_value, $sub_name];
}
}
}
// If no specific sub-term, use the main term
$sort_value = normalize_grade_for_sorting($term_name);
return [$sort_value, $term_name];
}
}
return [999, 'Unknown']; // Default for unknown
}
}
// Function to normalize any grade string into a sortable number
if (!function_exists('normalize_grade_for_sorting')) {
function normalize_grade_for_sorting($grade_string) {
$grade_lower = strtolower(trim($grade_string));
// Handle kindergarten variations
if (strpos($grade_lower, 'k') !== false || strpos($grade_lower, 'kindergarten') !== false) {
return 0;
}
// Extract numbers from grade strings (1st, 2nd, 3rd, etc.)
if (preg_match('/(\d+)/', $grade_lower, $matches)) {
return (int)$matches[1];
}
// Handle specific school level terms
if (strpos($grade_lower, 'elementary school') !== false) return 50;
if (strpos($grade_lower, 'middle school') !== false) return 100;
if (strpos($grade_lower, 'high school') !== false) return 200;
// If we can't determine, return high number so it sorts to end
return 999;
}
}
// Custom sorting function: Grade Level > Subject > Course Name
usort($courses, function($a, $b) {
// 1. Sort by Grade Level (numeric)
if ($a['grade_level_sort'] !== $b['grade_level_sort']) {
return $a['grade_level_sort'] <=> $b['grade_level_sort'];
}
// 2. Sort by Subject with sub-terms (alphabetical)
if ($a['subject'] !== $b['subject']) {
return strcmp($a['subject'], $b['subject']);
}
// 3. Sort by Course Name (alphabetical)
return strcmp($a['title'], $b['title']);
});
Deeper insights: Case Studies
The Moody's Analytics' Course Catalog
At Moody’s, I led the redesign of their course catalog from discovery through design and implementation. I analyzed site analytics and user behavior to uncover pain points like high bounce rates, siloed catalogs, and poor mobile usability.
I then prototyped solutions that emphasized unified navigation, responsive filters, and a more intuitive browsing experience. Finally, I built the catalog in Sitecore—writing the necessary front-end and CMS code to support dynamic filtering and enabling content creators to manage courses with ease.
Over time, I produced several iterations of the catalog, continuously refining the design and functionality based on data and feedback.
View the Full Case Study
BradyCandell.com