i'm using ACF and the repeater to spit out a series of subfields including:
image
header
description
button title
button link
But, while most of the sliders have all of them, SOME don't have the button title or link so if i don't fill it out, it just shows the blank button with no text.
Can someone assist where in the code below i can hide the button if the user does not add in anything into the field in the meta field in the WP backend?
<?php if( have_rows('feature_slider') ): ?>
<div class="swiper-container">
<div class="swiper-wrapper">
<?php while( have_rows('feature_slider') ): the_row();
$feature_image = get_sub_field('feature_image');
$card_heading = get_sub_field('card_heading');
$card_description = get_sub_field('card_description');
$card_button_text = get_sub_field('card_button_text');
$card_link_url = get_sub_field('card_link_url');
?>
<!-- slider -->
<div class="swiper-slide">
<div class="bg--pattern"></div>
<div class="absolute c-card"><div class="card-content">
<h2><?php the_sub_field('card_heading'); ?></h2>
<p><?php the_sub_field('card_description'); ?></p>
<a class="card-btn" href="<?php the_sub_field('card_link_url'); ?>"><?php the_sub_field('card_button_text'); ?> ⟶</a></div></div>
<img src="<?php echo esc_url($feature_image['url']); ?>" alt="<?php echo esc_attr($feature_image['alt']); ?>" />
<div class="c--content-card">
<h2><?php the_sub_field('card_heading'); ?></h2>
<p><?php the_sub_field('card_description'); ?></p>
</div> <!-- card -->
</div> <!-- swiper slide -->
<?php endwhile; ?>
<?php endif; ?>
The button you'll see that i'm trying to hide is begins <a class="card-btn" ....
but would also be useful to know how to do it for other ACF php I add in.
Thank you!
A simple !empty() check will do it.
$btn_text = get_sub_field('card_button_text');
if (!empty($btn_text)) {
$card_link = get_sub_field('card_link_url');
echo '<a class="card-btn" href="' . esc_url($card_link) . '">' . esc_html($btn_text) . '</a>';
}
Update: Full code as #Churchill requested:
<?php if ( have_rows('feature_slider') ) : ?>
<div class="swiper-container">
<div class="swiper-wrapper">
<?php while ( have_rows('feature_slider') ) :
the_row();
$feature_image = get_sub_field('feature_image');
$card_heading = get_sub_field('card_heading');
$card_description = get_sub_field('card_description');
$card_button_text = get_sub_field('card_button_text');
$card_link_url = get_sub_field('card_link_url'); ?>
<!-- slider -->
<div class="swiper-slide">
<div class="bg--pattern"></div>
<div class="absolute c-card">
<div class="card-content">
<h2><?php the_sub_field('card_heading'); ?></h2>
<p><?php the_sub_field('card_description'); ?></p>
<?php
if (!empty($card_button_text)) {
echo '<a class="card-btn" href="' . esc_url($card_link_url) . '">' . esc_html($card_button_text) . ' ⟶</a>';
}
?>
</div>
</div>
<img src="<?php echo esc_url($feature_image['url']); ?>" alt="<?php echo esc_attr($feature_image['alt']); ?>" />
<div class="c--content-card">
<h2><?php the_sub_field('card_heading'); ?></h2>
<p><?php the_sub_field('card_description'); ?></p>
</div> <!-- card -->
</div><!-- swiper slide -->
<?php endwhile; ?>
</div><!-- swiper-wrapper -->
</div><!-- swiper-container -->
<?php endif; ?>
I'm using Bootstrap, I have a list of posts and I want to wrap every 2 posts on a row. Each post is wrapped on a <div col>. You can see live here.
I tried with this but it wrap the row each one post:
<?php
$num = 0;
// Check if there are any posts to display
if ( have_posts() ) : ?>
<?php
// The Loop
while ( have_posts() ) : the_post();
if($num%2) {
echo "<div class='row' style='margin-bottom: 2.3em;''>";
}
?>
<div class="col-xs-12 col-sm-6 col-md-6">
<h2 class="category-encabezado">
<a href="<?php the_permalink() ?>" rel="bookmark" title="Enlace a <?php the_title_attribute(); ?>">
<?php the_title(); ?>
</a>
</h2>
<small>Hace
<?php echo human_time_diff( get_the_time('U'), current_time('timestamp') ) . ''; ?>
</small>
<div class="entry">
<p>
<?php the_excerpt(); ?>
</p>
<?php
$my_shortcode = get_field('audio-field');
echo do_shortcode( $my_shortcode );
?>
</div>
</div>
<?php
if($num %2) {
echo '</div>';
}
$num++
?>
<?php endwhile; // End Loop
?>
</div>
<?php
You have to put div.row Out of the Loop while
Right now the code below generates the content seen here:
Currently the title has to be clicked for the post page to be loaded, but I want to allow the entire background image to be clickable. Is this possible? I've tried surrounding the card div with the tag from the title code, but that still did not let me click the background image like a link.
<article id="post-<?php the_ID(); ?>" <?php post_class('card-box col-lg-4 col-md-6 col-sm-12 col-xs-12'); ?>>
<div class="card" data-background="image" data-src="<?php esc_url( the_post_thumbnail_url( 'large' ) ); ?>">
<div class="header">
<?php
$categories = get_the_category();
if ( ! empty( $categories ) ) {
?>
<div class="category">
<h6>
<span class="category">
<?php echo '<a class="category" href="' . esc_url( get_category_link( $categories[0]->term_id ) ) . '">' . esc_html( $categories[0]->name ) . '</a>'; ?>
</span>
</h6>
</div>
<?php } ?>
</div>
<div class="content">
<?php the_title( '<h4 class="entry-title">', '</h4>' ); ?>
<span class="date"><?php echo esc_html( get_the_date() ); ?></span>
</div>
<div class="filter"></div>
</div> <!-- end card -->
</article>
Try jQuery approach like below
$('.card').on('click', function(event){
var elementTag = event.target.tagName.toLowerCase();
if(elementTag === 'div') {
var pageurl = $(this).find('.entry-title a').attr('href');
window.location.href = pageurl;
}
});`
I have a problem in my template (wordpress).
I want to create a portfolio page which contains 3 columns and which can display posts in my portfolio page (without jumping a new page). And I need to repeat these three posts after each third post. I will assign "hidden" class to my duplicate posts and when clicking at the column, class shall set as "block".
I have a code:
<?php get_header(); ?>
<section> <div class="container container-bazar container-gallery"><?php
$array = array();
$count = 0;
$i = 0;
$args = array(
'posts_per_page' => -1,
'post_type' => 'gallery',
);
$gallery = new WP_Query( $args );
if($gallery->have_posts()) :
while($gallery->have_posts()) :
$gallery->the_post(); ?>
<div class="col-1 boxes<?php if( $count%3 == 0 ) { echo '-1'; }; $count++; ?>">
<div class="post" id="post-<?php the_ID(); ?>">
<figure class="indent-bot">
<a href="<?php the_permalink(); ?>" rel="nofollow">
<?php the_post_thumbnail(array(380,220,true)); ?>
</a>
</figure>
<div class="col-1-content">
<strong class="title-3">
<a href="<?php the_permalink(); ?>" rel="nofollow">
<?php the_title(); ?>
</a>
</strong>
<div class="entry">
<a href="<?php the_permalink(); ?>" rel="nofollow">
<?php the_excerpt(); ?>
</a>
</div><!-- .entry -->
</div><!-- .col-1-content-->
</div><!-- .post -->
</div> <!-- .boxes -->
<?php endwhile; ?>
<?php while($gallery->have_posts()) :
$gallery->the_post();?>
<?php $imgaddr1 = get_post_meta($post->ID, 'imgaddr1', true);
$imgaddr2 = get_post_meta($post->ID, 'imgaddr2', true);
$imgssilka1 = get_post_meta($post->ID, 'imgssilka1', true);
$imgssilka2 = get_post_meta($post->ID, 'imgssilka2', true);
$namecolor1 = get_post_meta($post->ID, 'namecolor1', true);
$namecolor2 = get_post_meta($post->ID, 'namecolor2', true);
$numbercolor1 = get_post_meta($post->ID, 'numbercolor1', true);
$numbercolor2 = get_post_meta($post->ID, 'numbercolor2', true); ?>
</div>
<div class="full clearfix">
<div class="inner">
<figure class="indent-bot1">
<a href="<?php the_permalink(); ?>" rel="nofollow">
<?php the_post_thumbnail(array(960,690)); ?>
</a>
</figure>
<div class="row">
<div class="col-md-5">
<div class="inf-1">
<h4>Информация</h4>
</div>
<div class="inf-2">
<h5><?php the_title(); ?></h5>
<div class="desc">
<?php the_excerpt(); ?>
</div>
</div>
<div class="clearfix"></div>
</div>
<div class="col-md-7 border-left">
<div class="inf-1">
<h4>Приложенные Цвета</h4>
</div>
<div class="inf-2">
<ul>
<li class="first-child">
<a href="<?php echo $imgssilka1; ?>" class="img-block">
<img src="<?php echo $imgaddr1; ?>">
</a>
<div class="txt">
<strong><?php echo $namecolor1; ?></strong>
<span><?php echo $numbercolor1; ?></span>
</div>
</li>
<li class="last-child">
<a href="<?php echo $imgssilka2; ?>" class="img-block">
<img src="<?php echo $imgaddr2; ?>">
</a>
<div class="txt">
<strong><?php echo $namecolor2; ?></strong>
<span><?php echo $numbercolor2; ?></span>
</div>
</li>
</ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</div><!-- .inner -->
</div>
<div class="container container-bazar container-gallery">
<?php endwhile;
else:
endif; ?>
</div><!-- .container -->
</section>
<?php get_footer(); ?>
but this code displays posts sequentially.
$i = 1;
//added before to ensure it gets opened
echo '<div>';
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();
// post stuff...
// if multiple of 3 close div and open a new div
if($i % 3 == 0) {echo '</div><div>';}
$i++; endwhile; endif;
//make sure open div is closed
echo '</div>';
This is quite an unusual setup which had me thinking. There is a way without rerunning the loop
HERE IS HOW
You need to run your loop only once. In stead of the default loop, we will pull out our posts array from our query and run our posts through a foreach loop. This is where we will start things
We need to split our content up so we can get two blocks with post data, and this need to be saved into an array which we will use later. To achieve this, build two concatenated strings of data ( one string with the first block of data and the second one with the second block of data ) which will be saved in two separate variables.
Once this is done, we need to add our divs to form blocks of posts containing three posts, each with a unique class. This goes for both sets of string
Now we need to calculate new array keys so we can build a new array of post data sorted so we have a sequence of a block of post data with three posts from string one, then a block of post data with the same three posts from string two etc
Finally, because our array of posts is still mixed and is out of order, we will sort the array so the keys are numerical, then we can use a last foreach loop to output our post data
HERE IS THE CODE
Just a note or two before I post the code
You need to modify the classes etc to suite your needs
The code is not fully tested, but the div blocks and sorting works as expected
I have commented the code to make it easier to follow
Finally, the code
$args = array(
'posts_per_page' => -1,
'post_type' => 'gallery',
);
$gallery = new WP_Query( $args );
// Check if we have posts before we continue
if( $gallery->have_posts() ) {
// Use the array of posts and a foreach loop to build out super array
foreach ( $gallery->posts as $key=>$post ) {
// Setup postdata so we can make use of template tags
setup_postdata( $post );
// Setup/define our first variable which will hold our first set of post data
$output = '';
// Open a new div on the first post and every 3rd one there after to hold three posts
if ( $key%3 == 0 ) {
// We will call this class "first-x" where x represents the block count
$output .= '<div class="first-' . floor( $key / 3 ) . '">';
}
// Concatenate your first loop into a string to our first variable $output
$output .= '<div class="post" id="post-' . $post->ID . '">
<figure class="indent-bot">
<a href="' . get_the_permalink() . '" rel="nofollow">
' . get_the_post_thumbnail( $post->ID, array( 380,220,true ) ) . '
</a>
</figure>
<div class="col-1-content">
<strong class="title-3">
<a href="' . get_the_permalink() . '" rel="nofollow">
' . get_the_title() . '
</a>
</strong>
<div class="entry">
<a href="' . get_the_permalink() . '" rel="nofollow">
' . get_the_excerpt() . '
</a>
</div><!-- .entry -->
</div><!-- .col-1-content-->
</div><!-- .post -->
</div> <!-- .boxes -->';
// Add our closing div after every third post or the last post if there is less than three
if ( $key%3 == 2 || !array_key_exists( ( $key + 1 ), $gallery->posts ) ) {
$output .= '</div>';
}
// Create our new array of post data split in two and use with new array keys
$new_posts_array[floor( $key / 3 ) * 3 + $key] = $output;
// Setup/define our second variable which will hold the second set of post data from our posts
// This is the set that you would like to hide
$output_1 = '';
// Open a new div on the first post and every 3rd one there after to hold three posts
if ( ( $key%3 ) == 0 ) {
// This block of posts will use class "second-x" where x represents the block count
$output_1 .= '<div class="second-' . floor( $key / 3 ) . '">';
}
$imgaddr1 = get_post_meta( $post->ID, 'imgaddr1', true );
$imgaddr2 = get_post_meta( $post->ID, 'imgaddr2', true );
$imgssilka1 = get_post_meta( $post->ID, 'imgssilka1', true );
$imgssilka2 = get_post_meta( $post->ID, 'imgssilka2', true );
$namecolor1 = get_post_meta( $post->ID, 'namecolor1', true );
$namecolor2 = get_post_meta( $post->ID, 'namecolor2', true );
$numbercolor1 = get_post_meta( $post->ID, 'numbercolor1', true );
$numbercolor2 = get_post_meta( $post->ID, 'numbercolor2', true );
// Concatenate your second set of post data into a string to our second variable $output_1
$output_1 .= '<div class="full clearfix">
<div class="inner">
<figure class="indent-bot1">
<a href="' . get_the_permalink() . '" rel="nofollow">
' . get_the_post_thumbnail( $post->ID, array( 960, 690 ) ) . '
</a>
</figure>
<div class="row">
<div class="col-md-5">
<div class="inf-1">
<h4>Информация</h4>
</div>
<div class="inf-2">
<h5>' . get_the_title() . '</h5>
<div class="desc">
' . get_the_excerpt() . '
</div>
</div>
<div class="clearfix"></div>
</div>
<div class="col-md-7 border-left">
<div class="inf-1">
<h4>Приложенные Цвета</h4>
</div>
<div class="inf-2">
<ul>
<li class="first-child">
<a href="' . $imgssilka1 . '" class="img-block">
<img src="' . $imgaddr1 . '">
</a>
<div class="txt">
<strong>' . $namecolor1 . '</strong>
<span>' . $numbercolor1 . '</span>
</div>
</li>
<li class="last-child">
<a href="' . $imgssilka2 . '" class="img-block">
<img src="' . $imgaddr2 . '">
</a>
<div class="txt">
<strong>' . $namecolor2 . '</strong>
<span>' . $numbercolor2 . '</span>
</div>
</li>
</ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</div><!-- .inner -->
</div>';
// Add our closing div after every third post or the last post if there is less than three
if ( $key%3 == 2 || !array_key_exists( ( $key + 1 ), $gallery->posts ) ) {
$output_1 .= '</div>';
}
// Create our new array of post data split in two and use with new array keys
$new_posts_array[( floor( $key / 3 ) + 1 ) * 3 + $key] = $output_1;
}
wp_reset_postdata();
// Sort our new array so that the keys are numerical again
ksort( $new_posts_array );
// Run a foreach loop to output our posts as we need. No need to modify anything here
foreach ( $new_posts_array as $v )
echo $v;
}
As we all know, WordPress is an open source tool and all plugins are available to manage such formatting.
I recommend to go with plugins to manage your requirements. I have used columns plugin for formatted output.
I got the total number of records and made the loop.
Inside the loop, two-cycle.
First loop displays a table. The second cycle displays a list.
<section>
<div class="container container-gallery">
<?php
$offset = 0;
$offset1 = 0;
$i =0;
$count = 0;
$reset =0;
$reset1 = 0;
$args = array(
'posts_per_page' => -1,
'post_type' => 'gallery',
);
$gallery = new WP_Query( $args );
$numberposts = $gallery->post_count;
if ($numberposts){
$id1=0;
$id2=0;
while($count < $numberposts){
// print_r($arr1);
$count++;
//echo "<h2>".$count."</h2>";
$arr1 = array(
'posts_per_page' => 400,
'post_type' => 'gallery',
'offset'=>$offset
);
$arr2 = array(
'posts_per_page' => 400,
'post_type' => 'gallery',
'offset'=>$offset1
);
$loop1 = new WP_Query($arr1);
$loop2 = new WP_Query($arr1);
while($loop1->have_posts()) : $loop1->the_post();
if ($reset<3) :
$reset++;
?>
<?php
$colorfilter1 = get_post_meta($post->ID, 'checkboxwhite', true);
$colorfilter2 = get_post_meta($post->ID, 'checkbox_beige', true);
$colorfilter3 = get_post_meta($post->ID, 'checkbox_brown', true);
$colorfilter4 = get_post_meta($post->ID, 'checkbox_gray', true);
$colorfilter5 = get_post_meta($post->ID, 'checkbox_black', true);
$colorfilter6 = get_post_meta($post->ID, 'checkbox_vvid', true);
if ($colorfilter1 != "") $colorfilter1 ="white ";
if ($colorfilter2 != "") $colorfilter2 ="beige ";
if ($colorfilter3 != "") $colorfilter3 ="brown ";
if ($colorfilter4 != "") $colorfilter4 ="gray ";
if ($colorfilter5 != "") $colorfilter5 ="black ";
if ($colorfilter6 != "") $colorfilter6 ="vivid ";
$class_color = $colorfilter1.$colorfilter2.$colorfilter3.$colorfilter4.$colorfilter5.$colorfilter6;
?>
<div class="col-1 mcol boxes<?php if( $i%3 == 0 ) { echo '-1'; }; $i++; echo ' '.$class_color;?>" id="colbox<?php echo $id1; $id1++;?>" data-id="click" >
<div class="post" id="post-<?php the_ID(); ?>">
<figure class="indent-bot">
<?php the_post_thumbnail(array(380,220,true)); ?>
</figure>
<div class="col-1-content">
<strong class="title-3">
<?php the_title(); ?>
</strong>
<div class="entry">
<?php the_excerpt(); ?>
</div><!-- .entry -->
</div><!-- .col-1-content-->
</div><!-- .post -->
</div><!-- .boxes -->
<?php else : break;?>
<?php endif; ?>
<?php endwhile; ?>
<?php
$reset = 0;
$offset +=3;
?>
<?php wp_reset_postdata(); ?>
<?php
while($loop2->have_posts()) : $loop2->the_post();
if ($reset1<3) :
$reset1++;
?>
<?php
$numbercolor1 = get_post_meta($post->ID, 'numbercolor1',true);
$numbercolor2 = get_post_meta($post->ID, 'numbercolor2', true);
$imgaddr1 = get_post_meta($post->ID, 'imgaddr1', true);
$imgaddr2 = get_post_meta($post->ID, 'imgaddr2', true);
$imgssilka1 = get_post_meta($post->ID, 'imgssilka1', true);
$imgssilka2 = get_post_meta($post->ID, 'imgssilka2', true);
$namecolor1 = get_post_meta($post->ID, 'namecolor1', true);
$namecolor2 = get_post_meta($post->ID, 'namecolor2', true);
?>
</div>
<div class="full clearfix active colbox<?php echo $id2; $id2++;?>" id="">
<div class="inner">
<figure class="indent-bot1">
<a href="<?php the_permalink(); ?>" rel="nofollow">
<?php the_post_thumbnail(array(960,690)); ?>
</a>
</figure>
<div class="row">
<div class="col-md-5">
<div class="inf-1">
<h4>Информация</h4>
</div>
<div class="inf-2">
<h5><?php the_title(); ?></h5>
<div class="desc">
<?php the_excerpt(); ?>
</div>
</div>
<div class="clearfix"></div>
</div>
<div class="col-md-7 border-left">
<div class="inf-1">
<h4>Приложенные<</h4>
</div>
<div class="inf-2">
<ul>
<li class="first-child">
<a href="<?php echo $imgssilka1; ?>" class="img-block">
<img src="<?php echo $imgaddr1; ?>">
</a>
<div class="txt">
<strong><?php echo $namecolor1; ?></strong>
<span><?php echo $numbercolor1; ?></span>
</div>
</li>
<li class="last-child">
<a href="<?php echo $imgssilka2; ?>" class="img-block">
<img src="<?php echo $imgaddr2; ?>">
</a>
<div class="txt">
<strong><?php echo $namecolor2; ?></strong>
<span><?php echo $numbercolor2; ?></span>
</div>
</li>
</ul>
</div>
<div class="clearfix"></div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="c_btn"></div>
</div>
</div>
</div><!-- .inner -->
</div>
<div class="container container-gallery">
<?php else : break;?>
<?php endif; ?>
<?php endwhile; ?>
<?php
$reset1 = 0;
$offset1 +=3;
?>
<?php wp_reset_postdata(); ?>
<?php
} //end if ($count <= $numberposts)
} //end if ($numberposts)
?>
<?php
if ( have_posts() ) while ( have_posts() ) : the_post(); // старт цикла ?>
<article id="post-<?php the_ID(); ?>">
<?php the_content(); ?>
</article>
<?php endwhile; ?>
</div><!-- .container -->
</section>
I'm trying to show different text on WordPress based on a value from a select box. I have written an "if and else" statement but it isn't working for some weird reason. Here is my code:
<?php global $wpUserStylesheetSwitcher;$wpUserStylesheetSwitcher->show_wp_user_stylesheet_switcher(array('list_title'=>'Change theme', 'show_list_title'=>'true', 'list_type'=>'blogstyle'));
$gdgt_theme = '<script>var yourSelect = document.getElementById( "gdgt-test" );document.write( yourSelect.options[ yourSelect.selectedIndex ].value )</script>';
echo $gdgt_theme;
if ($gdgt_theme == 0) { ?>
<article class="gdgt-article">
<div class="gdgt-loop-post">
<a href="<?php echo get_permalink(); ?>" title="<?php echo the_title(); ?>">
<div class="gdgt-loop-thumb">
<?php
if ( has_post_thumbnail() ) {
the_post_thumbnail('gdgt_loop_thumb');
}
else {
echo '<img src="http://for-b.tk/_ph/13/934023873.gif" title="Image not available yet" alt="image-coming-soon"/>';
}
?>
<div class="loop-overlay"></div>
</div>
<div class="gdgt-post-meta">
<h1><?php echo the_title_limit(70, '…'); ?></h1>
</a>
<div class="gdgt-article-meta">
by <?php the_author_meta( 'display_name' ); ?> - <?php echo the_time(); ?>
</div>
<div class="gdgt-post-excerpt">
<?php echo "test" ?>
</div>
</div>
</div>
</article>
<?php }
else {
?>
<article class="gdgt-article">
<div class="gdgt-loop-post">
<a href="<?php echo get_permalink(); ?>" title="<?php echo the_title(); ?>">
<div class="gdgt-loop-thumb">
<?php
if ( has_post_thumbnail() ) {
the_post_thumbnail('gdgt_loop_thumb');
}
else {
echo '<img src="http://for-b.tk/_ph/13/934023873.gif" title="Image not available yet" alt="image-coming-soon"/>';
}
?>
<div class="loop-overlay"></div>
</div>
<div class="gdgt-post-meta">
<h1><?php echo the_title_limit(70, '…'); ?></h1>
</a>
<div class="gdgt-article-meta">
by <?php the_author_meta( 'display_name' ); ?> - <?php echo the_time(); ?>
</div>
<div class="gdgt-post-excerpt">
<?php echo "else works"; ?>
</div>
</div>
</div>
</article>
<?php }
?>
Code Explanation: First I try to get the value from the select box using a simple JS code. I then echo it so that I can see it is returning the correct value. Then I run the if and else
The Problem: When the value == 0, the "test" text shows up, but when it isn't equal to 0, the text "test" still shows up. I'm not sure what's wrong with my code. Please help.