En tu tema puedes crear un archivo llamado "functions.php" que contenga funcciones, en ese archivo, simplemente escribe nuevas funciones basándote en las propias del core, por ejemplo algo así
function osc_categories_select_custom($name = 'sCategory', $category = null, $default_str = null) {
if($default_str == null) $default_str = __('Select a category');
category_select_custom(Category::newInstance()->toTree(), $category, $default_str, $name);
}
function category_select_custom($categories, $category, $default_item = null, $name = "sCategory")
{
echo '<select name="' . $name . '" id="' . $name . '">';
if(isset($default_item)) {
echo '<option value="">' . $default_item . '</option>';
}
foreach($categories as $c) {
echo '<option value="' . $c['pk_i_id'] . '"' . ( ($category['pk_i_id'] == $c['pk_i_id']) ? 'selected="selected"' : '' ) . '>' . $c['s_name'] . '</option>';
if(isset($c['categories']) && is_array($c['categories'])) {
subcategory_select_custom($c['categories'], $category, $default_item, 1);
}
}
echo '</select>';
}
function subcategory_select_custom($categories, $category, $default_item = null, $deep = 0)
{
$deep_string = "";
for($var = 0;$var<$deep;$var++) {
$deep_string .= ' ';
}
$deep++;
foreach($categories as $c) {
echo '<option value="' . $c['pk_i_id'] . '"' . ( ($category['pk_i_id'] == $c['pk_i_id']) ? 'selected="selected"' : '' ) . '>' . $deep_string.$c['s_name'] . '</option>';
if(isset($c['categories']) && is_array($c['categories'])) {
subcategory_select_custom($c['categories'], $category, $default_item, $deep);
}
}
}