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
<article id="cardMachine" role="region" aria-label="Card carousel">
<button id="btnBack" aria-label="Previous card" type="button">
<svg viewBox="0 0 25 21" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M2 10.75L23 10.75M2 10.75L11 2M2 10.75L11 19.5" stroke="#003865" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</button>
<section id="cardHolder">
<article class="actualCard cardNumber1" style="z-index: 10000; background-color: rgb(0, 43, 73); border-color: rgb(0, 43, 73); transform: translate(0px, -6.5px) rotate(0deg) scale(1); opacity: 1; pointer-events: auto;">
<div class="imageHolder">
<img decoding="async"
src="/wp-content/uploads/2025/09/people-in-smart-casual-wear.jpg"
class="cardImage"
alt="Professional team members collaborating, representing shared vision">
</div>
<h3 class="cardHeadline" style="color: #FFFFFF;">Shared Vision</h3>
<p class="cardTextArea" style="color: #FFFFFF;">Clear communication helps align diverse perspectives. Whether sketching strategies or mapping next steps, I value using visuals and teamwork to build momentum.</p>
</article>
</section>
<button id="btnForward" aria-label="Next card" type="button">
<svg viewBox="0 0 25 21" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M23 10.75L2 10.75M23 10.75L14 19.5M23 10.75L14 2" stroke="#003865" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</button>
</article>

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