Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 657 lines (642 sloc) 23.092 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
<?php
/**
* Oenology Theme Options
*
* This file defines the Options for the Oenology Theme.
*
* Theme Options Functions
*
* - Define Default Theme Options
* - Register/Initialize Theme Options
* - Define Admin Settings Page
* - Register Contextual Help
*
* @package Oenology
* @copyright Copyright (c) 2011, Chip Bennett
* @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU General Public License, v2 (or newer)
*
* @since Oenology 1.0
*/

/**
* Globalize the variable that holds the Theme Options
*
* @global array $oenology_options holds Theme options
*/
global $oenology_options;

/**
* Oenology Theme Settings API Implementation
*
* Implement the WordPress Settings API for the
* Oenology Theme Settings.
*
* @link http://codex.wordpress.org/Settings_API Codex Reference: Settings API
* @link http://ottopress.com/2009/wordpress-settings-api-tutorial/ Otto
* @link http://planetozh.com/blog/2009/05/handling-plugins-options-in-wordpress-28-with-register_setting/ Ozh
*/
function oenology_register_options(){
require( get_template_directory() . '/functions/options-register.php' );
}
// Settings API options initilization and validation
add_action( 'admin_init', 'oenology_register_options' );

/**
* Setup the Theme Admin Settings Page
*
* Add "Oenology Options" link to the "Appearance" menu
*
* @uses oenology_get_settings_page_cap() defined in \functions\wordpress-hooks.php
*/
function oenology_add_theme_page() {
// Globalize Theme options page
global $oenology_settings_page;
// Add Theme options page
$oenology_settings_page = add_theme_page(
// $page_title
// Name displayed in HTML title tag
__( 'Oenology Options', 'oenology' ),
// $menu_title
// Name displayed in the Admin Menu
__( 'Oenology Options', 'oenology' ),
// $capability
// User capability required to access page
oenology_get_settings_page_cap(),
// $menu_slug
// String to append to URL after "themes.php"
'oenology-settings',
// $callback
// Function to define settings page markup
'oenology_admin_options_page'
);
// Load contextual help
add_action( 'load-' . $oenology_settings_page, 'oenology_settings_page_contextual_help' );
}
// Load the Admin Options page
add_action( 'admin_menu', 'oenology_add_theme_page' );

/**
* Oenology Theme Settings Page Markup
*
* @uses oenology_get_current_tab() defined in \functions\custom.php
* @uses oenology_get_page_tab_markup() defined in \functions\custom.php
*/
function oenology_admin_options_page() {
// Determine the current page tab
$currenttab = oenology_get_current_tab();
// Define the page section accordingly
$settings_section = 'oenology_' . $currenttab . '_tab';
?>

<div class="wrap">
<?php oenology_get_page_tab_markup(); ?>
<?php if ( isset( $_GET['settings-updated'] ) ) {
     echo '<div class="updated"><p>';
echo __( 'Theme settings updated successfully.', 'oenology' );
echo '</p></div>';
} ?>
<form action="options.php" method="post">
<?php
// Implement settings field security, nonces, etc.
settings_fields('theme_oenology_options');
// Output each settings section, and each
// Settings field in each section
do_settings_sections( $settings_section );
?>
<?php submit_button( __( 'Save Settings', 'oenology' ), 'primary', 'theme_oenology_options[submit-' . $currenttab . ']', false ); ?>
<?php submit_button( __( 'Reset Defaults', 'oenology' ), 'secondary', 'theme_oenology_options[reset-' . $currenttab . ']', false ); ?>
</form>
</div>
<?php
}

/**
* Oenology Theme Option Defaults
*
* Returns an associative array that holds
* all of the default values for all Theme
* options.
*
* @uses oenology_get_option_parameters() defined in \functions\options.php
*
* @return array $defaults associative array of option defaults
*/
function oenology_get_option_defaults() {
// Get the array that holds all
// Theme option parameters
$option_parameters = oenology_get_option_parameters();
// Initialize the array to hold
// the default values for all
// Theme options
$option_defaults = array();
// Loop through the option
// parameters array
foreach ( $option_parameters as $option_parameter ) {
$name = $option_parameter['name'];
// Add an associative array key
// to the defaults array for each
// option in the parameters array
$option_defaults[$name] = $option_parameter['default'];
}
// Return the defaults array
return apply_filters( 'oenology_option_defaults', $option_defaults );
}

/**
* Define default options tab
*/
function oenology_define_default_options_tab( $options ) {
$options['default_options_tab'] = 'varietals';
return $options;
}
add_filter( 'oenology_option_defaults', 'oenology_define_default_options_tab' );

/**
* Oenology Theme Option Parameters
*
* Array that holds parameters for all options for
* Oenology. The 'type' key is used to generate
* the proper form field markup and to sanitize
* the user-input data properly. The 'tab' key
* determines the Settings Page on which the
* option appears, and the 'section' tab determines
* the section of the Settings Page tab in which
* the option appears.
*
* @return array $options array of arrays of option parameters
*/
function oenology_get_option_parameters() {

    $options = array(
        'header_nav_menu_position' => array(
'name' => 'header_nav_menu_position',
'title' => __( 'Header Nav Menu Position', 'oenology' ),
'type' => 'select',
'valid_options' => array(
'above' => array(
'name' => 'above',
'title' => __( 'Above', 'oenology' )
),
'below' => array(
'name' => 'below',
'title' => __( 'Below', 'oenology' )
),
'none' => array(
'name' => 'none',
'title' => __( 'Do Not Display', 'oenology' )
)
),
'description' => __( 'Display header navigation menu above or below the site title/description?', 'oenology' ),
'section' => 'header',
'tab' => 'general',
'since' => '1.1',
'default' => 'above'
),
'header_nav_menu_depth' => array(
'name' => 'header_nav_menu_depth',
'title' => __( 'Header Nav Menu Depth', 'oenology' ),
'type' => 'select',
'valid_options' => array(
'1' => array(
'name' => 1,
'title' => __( 'One', 'oenology' )
),
'2' => array(
'name' => 2,
'title' => __( 'Two', 'oenology' )
),
'3' => array(
'name' => 3,
'title' => __( 'Three', 'oenology' )
)
),
'description' => __( 'How many levels of Page hierarchy should the Header Navigation Menu display?', 'oenology' ),
'section' => 'header',
'tab' => 'general',
'since' => '1.1',
'default' => 1
),
        'header_nav_menu_item_width' => array(
'name' => 'header_nav_menu_item_width',
'title' => __( 'Header Nav Menu Item Width', 'oenology' ),
'type' => 'select',
'valid_options' => array(
'fixed' => array(
'name' => 'fixed',
'title' => __( 'Fixed', 'oenology' )
),
'fluid' => array(
'name' => 'fluid',
'title' => __( 'Fluid', 'oenology' )
)
),
'description' => __( 'Should Header Nav Menu items have a fixed or fluid width?', 'oenology' ),
'section' => 'header',
'tab' => 'general',
'since' => '2.1',
'default' => 'fluid'
),
        'display_footer_credit' => array(
'name' => 'display_footer_credit',
'title' => __( 'Display Footer Credit', 'oenology' ),
'type' => 'select',
'valid_options' => array(
'false' => array(
'name' => 'false',
'title' => __( 'Do Not Display', 'oenology' )
),
'true' => array(
'name' => 'true',
'title' => __( 'Display', 'oenology' )
)
),
'description' => __( 'Display a credit link in the footer? This option is disabled by default, and you are under no obligation whatsoever to enable it.', 'oenology' ),
'section' => 'footer',
'tab' => 'general',
'since' => '1.1',
'default' => false
),
'varietal' => array(
'name' => 'varietal',
'title' => __( 'Varietal', 'oenology' ),
'type' => 'custom',
'valid_options' => array(
'chardonnay' => array(
'name' => 'chardonnay',
'title' => __( 'Chardonnay', 'oenology' ),
'description' => __( 'Chardonnay is the ubiquitous white wine, produced from a versatile white grape.', 'oenology' ),
'scheme' => 'light'
),
'seyval-blanc' => array(
'name' => 'seyval-blanc',
'title' => __( 'Seyval Blanc', 'oenology' ),
'description' => __( 'Seyval Blanc is a white grape, typically grown in cooler climates, that produces a wine with flavors of citrus and mineral.', 'oenology' ),
'scheme' => 'light'
),
'muscat' => array(
'name' => 'muscat',
'title' => __( 'Muscat', 'oenology' ),
'description' => __( 'Muscat is a white grape with a pronounced flavor of grapes and spice, that produces a versatile wine from dry to sweet.', 'oenology' ),
'scheme' => 'light'
),
'solarized-light' => array(
'name' => 'solarized-light',
'title' => __( 'Solarized Light', 'oenology' ),
'description' => __( 'DESCRIPTION GOES HERE.', 'oenology' ),
'scheme' => 'light'
),
'syrah' => array(
'name' => 'syrah',
'title' => __( 'Syrah', 'oenology' ),
'description' => __( 'Syrah is a red grape that produces a full-bodied, almost inky-black wine with a spicy, earthy flavor and aroma.', 'oenology' ),
'scheme' => 'dark'
),
'malbec' => array(
'name' => 'malbec',
'title' => __( 'Malbec', 'oenology' ),
'description' => __( 'Malbec is a red grape that produces exceedingly dark, inky red-violet wins with intense flavors.', 'oenology' ),
'scheme' => 'dark'
),
'pinot-noir' => array(
'name' => 'pinot-noir',
'title' => __( 'Pinot Noir', 'oenology' ),
'description' => __( 'Pinot Noir is an extremely fickle yet versatile red grape from Burgundy.', 'oenology' ),
'scheme' => 'dark'
),
'zinfandel' => array(
'name' => 'zinfandel',
'title' => __( 'Zinfandel', 'oenology' ),
'description' => __( 'Zinfandel is a red grape known for its spicy, peppery, and berry characteristics.', 'oenology' ),
'scheme' => 'dark'
),
'solarized-dark' => array(
'name' => 'solarized-dark',
'title' => __( 'Solarized Dark', 'oenology' ),
'description' => __( 'DESCRIPTION GOES HERE.', 'oenology' ),
'scheme' => 'dark'
),
'cuvee' => array(
'name' => 'cuvee',
'title' => __( 'Cuvee', 'oenology' ),
'description' => __( 'Cuvee is a term often used by wineries to describe a particularly high-quality batch of wine. Cuvee is suitable for Child-theming.', 'oenology' ),
'scheme' => 'cuvee'
),
),
'description' => '',
'section' => 'varietal',
'tab' => 'varietals',
'since' => '1.1',
'default' => 'chardonnay'
),
        'default_static_page_layout' => array(
'name' => 'default_static_page_layout',
'title' => __( 'Default Static Page Layout', 'oenology' ),
'type' => 'radio',
'valid_options' => array(
'one-column' => array(
'name' => 'one-column',
'title' => __( '1-Column', 'oenology' ),
'description' => __( 'One column (full-width content)', 'oenology' )
),
'two-column' => array(
'name' => 'two-column',
'title' => __( '2-Column', 'oenology' ),
'description' => __( 'Two columns (menu on left, content on right)', 'oenology' )
),
'three-column' => array(
'name' => 'three-column',
'title' => __( '3-Column', 'oenology' ),
'description' => __( 'Three columns (menu on left, sidebar on right, content in the center)', 'oenology' )
),
),
'description' => __( 'Select the layout to be used as the default for static Pages when the "Default" page template is selected.', 'oenology' ),
'section' => 'default_layouts',
'tab' => 'layout',
'since' => '2.3',
'default' => 'three-column'
),
        'default_single_post_layout' => array(
'name' => 'default_single_post_layout',
'title' => __( 'Default Single Post Layout', 'oenology' ),
'type' => 'radio',
'valid_options' => array(
'one-column' => array(
'name' => 'one-column',
'title' => __( '1-Column', 'oenology' ),
'description' => __( 'One column (full-width content)', 'oenology' )
),
'two-column-left' => array(
'name' => 'two-column-left',
'title' => __( '2-Column, Left', 'oenology' ),
'description' => __( 'Two columns (content on the left, full-width sidebar on the right)', 'oenology' )
),
'two-column-right' => array(
'name' => 'two-column-right',
'title' => __( '2-Column, Right', 'oenology' ),
'description' => __( 'Two columns (content on the right, full-width sidebar on the left)', 'oenology' )
),
'three-column' => array(
'name' => 'three-column',
'title' => __( '3-Column', 'oenology' ),
'description' => __( 'Three columns (content in the center, half-width sidebars on the left and right)', 'oenology' )
),
),
'description' => __( 'Select the default layout to be used for single Blog Posts.', 'oenology' ),
'section' => 'default_layouts',
'tab' => 'layout',
'since' => '2.3',
'default' => 'two-column-left'
),
        'post_index_layout' => array(
'name' => 'post_index_layout',
'title' => __( 'Blog Posts Index Layout', 'oenology' ),
'type' => 'radio',
'valid_options' => array(
'one-column' => array(
'name' => 'one-column',
'title' => __( '1-Column', 'oenology' ),
'description' => __( 'One column (full-width content)', 'oenology' )
),
'two-column-left' => array(
'name' => 'two-column-left',
'title' => __( '2-Column, Left', 'oenology' ),
'description' => __( 'Two columns (content on the left, full-width sidebar on the right)', 'oenology' )
),
'two-column-right' => array(
'name' => 'two-column-right',
'title' => __( '2-Column, Right', 'oenology' ),
'description' => __( 'Two columns (content on the right, full-width sidebar on the left)', 'oenology' )
),
'three-column' => array(
'name' => 'three-column',
'title' => __( '3-Column', 'oenology' ),
'description' => __( 'Three columns (content in the center, half-width sidebars on the left and right)', 'oenology' )
),
),
'description' => __( 'Select the layout to be used for Blog Posts Index pages.', 'oenology' ),
'section' => 'default_layouts',
'tab' => 'layout',
'since' => '2.3',
'default' => 'two-column-left'
),
        'default_front_page_layout' => array(
'name' => 'default_front_page_layout',
'title' => __( 'Default Static Front Page Layout', 'oenology' ),
'type' => 'radio',
'valid_options' => array(
'one-column' => array(
'name' => 'one-column',
'title' => __( '1-Column', 'oenology' ),
'description' => __( 'One column (full-width content)', 'oenology' )
),
'two-column' => array(
'name' => 'two-column',
'title' => __( '2-Column', 'oenology' ),
'description' => __( 'Two columns (menu on left, content on right)', 'oenology' )
),
'three-column' => array(
'name' => 'three-column',
'title' => __( '3-Column', 'oenology' ),
'description' => __( 'Three columns (menu on left, sidebar on right, content in the center)', 'oenology' )
),
),
'description' => __( 'Select the layout to be used as the default for a static front page.', 'oenology' ),
'section' => 'default_layouts',
'tab' => 'layout',
'since' => '3.0',
'default' => 'one-column'
),
        'static_page_submenu_display' => array(
'name' => 'static_page_submenu_display',
'title' => __( 'Static Page Submenu Display', 'oenology' ),
'type' => 'select',
'valid_options' => array(
'always' => array(
'name' => 'always',
'title' => __( 'Always Display', 'oenology' )
),
'hierarchical' => array(
'name' => 'hierarchical',
'title' => __( 'Display Only on Hierarchical Pages', 'oenology' )
),
'never' => array(
'name' => 'never',
'title' => __( 'Never Display', 'oenology' )
)
),
'description' => __( 'Display the static Page left-column submenu?', 'oenology' ),
'section' => 'static_page_layout_options',
'tab' => 'layout',
'since' => '2.5',
'default' => 'always'
),
        'widget_display_default_state' => array(
'name' => 'widget_display_default_state',
'title' => __( 'Default Widget Display State', 'oenology' ),
'type' => 'select',
'valid_options' => array(
'block' => array(
'name' => 'block',
'title' => __( 'Display Content', 'oenology' )
),
'none' => array(
'name' => 'none',
'title' => __( 'Hide Content', 'oenology' )
),
),
'description' => __( 'The content of each Widget can be displayed or hidden via the "Show/Hide" link. Should Widget content be displayed or hidden by default?', 'oenology' ),
'section' => 'widgets',
'tab' => 'general',
'since' => '3.0',
'default' => 'none'
),
    );
    return apply_filters( 'oenology_get_option_parameters', $options );
}

/**
* Get Oenology Theme Options
*
* Array that holds all of the defined values
* for Oenology Theme options. If the user
* has not specified a value for a given Theme
* option, then the option's default value is
* used instead.
*
* @uses oenology_get_option_defaults() defined in \functions\options.php
*
* @uses get_option()
* @uses wp_parse_args()
*
* @return array $oenology_options current values for all Theme options
*/
function oenology_get_options() {
// Get the option defaults
$option_defaults = oenology_get_option_defaults();
// Globalize the variable that holds the Theme options
global $oenology_options;
// Parse the stored options with the defaults
$oenology_options = wp_parse_args( get_option( 'theme_oenology_options', array() ), $option_defaults );
// Return the parsed array
return $oenology_options;
}

/**
* Separate settings by tab
*
* Returns an array of tabs, each of
* which is an indexed array of settings
* included with the specified tab.
*
* @uses oenology_get_option_parameters() defined in \functions\options.php
* @uses oenology_get_settings_page_tabs() defined in \functions\options.php
*
* @return array $settingsbytab array of arrays of settings by tab
*/
function oenology_get_settings_by_tab() {
// Get the list of settings page tabs
$tabs = oenology_get_settings_page_tabs();
// Initialize an array to hold
// an indexed array of tabnames
$settingsbytab = array();
// Loop through the array of tabs
foreach ( $tabs as $tab ) {
$tabname = $tab['name'];
// Add an indexed array key
// to the settings-by-tab
// array for each tab name
$settingsbytab[] = $tabname;
}
// Get the array of option parameters
$option_parameters = oenology_get_option_parameters();
// Loop through the option parameters
// array
foreach ( $option_parameters as $option_parameter ) {
$optiontab = $option_parameter['tab'];
$optionname = $option_parameter['name'];
// Add an indexed array key to the
// settings-by-tab array for each
// setting associated with each tab
$settingsbytab[$optiontab][] = $optionname;
$settingsbytab['all'][] = $optionname;
}
// Return the settings-by-tab
// array
return $settingsbytab;
}
 
/**
* Oenology Theme Admin Settings Page Tabs
*
* Array that holds all of the tabs for the
* Oenology Theme Settings Page. Each tab
* key holds an array that defines the
* sections for each tab, including the
* description text.
*
* @uses oenology_get_varietal_text() defined in \functions\options-register.php
*
* @return array $tabs array of arrays of tab parameters
*/
function oenology_get_settings_page_tabs() {

$tabs = array(
        'varietals' => array(
'name' => 'varietals',
'title' => __( 'Varietals', 'oenology' ),
'sections' => array(
'varietal' => array(
'name' => 'varietal',
'title' => __( 'Varietal Options', 'oenology' ),
'description' => oenology_get_varietal_text()
)
)
),
        'layout' => array(
'name' => 'layout',
'title' => __( 'Layout', 'oenology' ),
'sections' => array(
'default_layouts' => array(
'name' => 'default_layouts',
'title' => __( 'Default Layouts', 'oenology' ),
'description' => __( 'Manage default layouts for static Pages, single Blog Posts, and Blog Post Index pages', 'oenology' )
),
'static_page_layout_options' => array(
'name' => 'static_page_layout_options',
'title' => __( 'Static Page Layout Options', 'oenology' ),
'description' => __( 'Manage options related to static Page layout', 'oenology' )
)
)
),
        'general' => array(
'name' => 'general',
'title' => __( 'General', 'oenology' ),
'sections' => array(
'header' => array(
'name' => 'header',
'title' => __( 'Header Options', 'oenology' ),
'description' => __( 'Manage Header options for the Oenology Theme. Refer to the contextual help screen for descriptions and help regarding each theme option.', 'oenology' )
),
'widgets' => array(
'name' => 'widgets',
'title' => __( 'Widget Display Options', 'oenology' ),
'description' => __( 'Manage Widget options for the Oenology Theme. Refer to the contextual help screen for descriptions and help regarding each theme option.', 'oenology' )
),
'footer' => array(
'name' => 'footer',
'title' => __( 'Footer Options', 'oenology' ),
'description' => __( 'Manage Footer options for the Oenology Theme. Refer to the contextual help screen for descriptions and help regarding each theme option.', 'oenology' )
)
)
),
    );
return apply_filters( 'oenology_get_settings_page_tabs', $tabs );
}

/**
* Add Section Text for the Varietal Settings Section
*/
function oenology_get_varietal_text() {

$oenology_options = oenology_get_options();
$option_parameters = oenology_get_option_parameters();
$oenology_varietals = $option_parameters['varietal']['valid_options'];
foreach ( $oenology_varietals as $varietal ) {
if ( $varietal['name'] == $oenology_options['varietal'] ) {
$oenology_current_varietal = $varietal;
}
}
$varietal_thumbnail_url = oenology_locate_template_uri( array( 'varietals/' . $oenology_options['varietal'] . '.png' ), false, false );
$text = '';
$text .= '<p>"Varietal" refers to wine made from exclusively or predominantly one variety of grape. Each varietal has unique flavor and aromatic characteristics. Refer to the contextual help screen for descriptions and help regarding each theme option.</p>';
$text .= '<img class="oenology-varietal-thumb" src="' . $varietal_thumbnail_url . '" width="150px" height="110px" alt="' . $oenology_options['varietal'] . '" />';
$text .= '<h4>Current Varietal</h4>';
$text .= '<dl><dt><strong>' . $oenology_current_varietal['title'] . '</strong></dt><dd>' . $oenology_current_varietal['description'] . '</dd></dl>';
return $text;
}
?>
Something went wrong with that request. Please try again.