So I am customizing the [CPT Bootstrap Carousel plugin][1] to fit my needs. I have added custom field support to the custom post type, where the custom field is suppose to add a button on the carousel items. I have been able to register the custom field in the backend and the button is showing up on the Carousel items, but the href
property is empty. I believe that the problem is in the custom loop or in the way I am using echo
, but I can´t seam to figure it out. The area where I believe the problem in the code is have been market with <!--Possible problem-->
.
Here is updated, functioning code: /PS: but have a look a phils answer, probably a more stable solution.
<?php
/*
Plugin Name: CPT Bootstrap Carousel
Plugin URI: http://www.tallphil.co.uk/bootstrap-carousel
Description: A custom post type for choosing images and content which outputs <a href="http://twitter.github.io/bootstrap/javascript.html#carousel" target="_blank">Bootstrap Carousel</a> from a shortcode. Requires Bootstrap javascript and CSS to be loaded separately.
Version: 1.1
Author: Phil Ewels
Author URI: http://phil.ewels.co.uk
License: GPLv2
*/
// Custom Post Type Setup
add_action( 'init', 'cptbc_post_type' );
function cptbc_post_type() {
$labels = array(
'name' => 'Carousel Images',
'singular_name' => 'Carousel Image',
'add_new' => 'Add New',
'add_new_item' => 'Add New Carousel Image',
'edit_item' => 'Edit Carousel Image',
'new_item' => 'New Carousel Image',
'view_item' => 'View Carousel Image',
'search_items' => 'Search Carousel Images',
'not_found' => 'No Carousel Image',
'not_found_in_trash' => 'No Carousel Images found in Trash',
'parent_item_colon' => '',
'menu_name' => 'Carousel'
);
$args = array(
'labels' => $labels,
'public' => true,
'exclude_from_search' => true,
'publicly_queryable' => false,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => true,
'capability_type' => 'page',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 21,
'supports' => array('title','excerpt','thumbnail', 'page-attributes', 'custom-fields')
);
register_post_type('cptbc', $args);
}
// Add theme support for featured images if not already present
// http://wordpress.stackexchange.com/questions/23839/using-add-theme-support-inside-a-plugin
function cptbc_addFeaturedImageSupport() {
$supportedTypes = get_theme_support( 'post-thumbnails' );
if( $supportedTypes === false )
add_theme_support( 'post-thumbnails', array( 'cptbc' ) );
elseif( is_array( $supportedTypes ) ) {
$supportedTypes[0][] = 'cptbc';
add_theme_support( 'post-thumbnails', $supportedTypes[0] );
}
}
add_action( 'after_setup_theme', 'cptbc_addFeaturedImageSupport');
// FRONT END
// Shortcode
function cptbc_shortcode($atts, $content = null) {
// Set default shortcode attributes
$defaults = array(
'interval' => '5000',
'showcaption' => 'true',
'showcontrols' => 'true'
);
// Parse incomming $atts into an array and merge it with $defaults
$atts = shortcode_atts($defaults, $atts);
return cptbc_frontend($atts);
}
add_shortcode('image-carousel', 'cptbc_shortcode');
// Display latest WftC
function cptbc_frontend($atts){
$id = rand(0, 999); // use a random ID so that the CSS IDs work with multiple on one page
$args = array( 'post_type' => 'cptbc', 'orderby' => 'menu_order', 'order' => 'ASC');
$loop = new WP_Query( $args );
$images = array();
while ( $loop->have_posts() ) {
$loop->the_post();
if ( '' != get_the_post_thumbnail() ) {
$title = get_the_title();
$content = get_the_excerpt();
$image = get_the_post_thumbnail( get_the_ID(), 'full' );
$link = get_post_custom_values('link');
$images[] = array('title' => $title, 'content' => $content, 'image' => $image, 'link' => $link);
}
}
if(count($images) > 0){
ob_start();
?>
<div id="cptbc_<?php echo $id; ?>" class="carousel slide">
<ol class="carousel-indicators">
<?php foreach ($images as $key => $image) { ?>
<li data-target="#cptbc_<?php echo $id; ?>" data-slide-to="<?php echo $key; ?>" data-interval="<?php echo $atts['interval']; ?>" <?php echo $key == 0 ? 'class="active"' : ''; ?>></li>
<?php } ?>
</ol>
<div class="carousel-inner">
<?php foreach ($images as $key => $image) { ?>
<div class="item <?php echo $key == 0 ? 'active' : ''; ?>">
<?php echo $image['image']; ?>
<?php if($atts['showcaption'] === 'true') { ?>
<div class="carousel-caption">
<h2><?php echo $image['title']; ?></h2>
<p class="lead"><?php echo $image['content']; ?></p>
<?php echo '<a class="btn btn-large btn-primary" href="' . $image['link'][0] . '">Läs mer</a>';?>
</div>
<?php } ?>
</div>
<?php } ?>
</div>
<?php if($atts['showcontrols'] === 'true') { ?>
<a class="left carousel-control" href="#cptbc_<?php echo $id; ?>" data-slide="prev">‹</a>
<a class="right carousel-control" href="#cptbc_<?php echo $id; ?>" data-slide="next">›</a>
<?php } ?>
</div>
<?php }
$output = ob_get_contents();
ob_end_clean();
// Restore original Post Data
wp_reset_postdata();
return $output;
}
// Call the carousel in javascript, else it won't start scrolling on its own
function cptbc_footer_js() {
?>
<script type="text/javascript">
jQuery(function(){
jQuery('.carousel').carousel()
});
</script>
<?php
}
add_action('wp_footer', 'cptbc_footer_js');
?>
var_dump($link);
?link
meta key?$image['link']
not$link['link']
$images[] = array(...
under the keylink
. you then loop over that array to output everything:foreach ($images as $key => $image)
, so you need to reference that key in the$image
variable.