0

I have a simple WP_Query that displays posts:

<?php
function vertical_posts( $title, $category, $num_of_posts ) { ?>
    <section class="vertical-posts">
        <h2 class="title"><?php echo $title; ?></h2>
        <div class="post-grid">
            <?php
            $args = array('category_name'  => $category, 'posts_per_page' => $num_of_posts);
            $query = new WP_Query($args);
            if ($query->have_posts()) {
                while ($query->have_posts()) {
                    $query->the_post();
                    ?>
                    <article class="post">
                        <a class="post-thumbnail" href="<?php the_permalink(); ?>" aria-hidden="true" tabindex="-1">
                            <img src="<?php the_post_thumbnail_url('landscape-medium-1x'); ?>" alt="<?php echo get_post_meta( get_post_thumbnail_id(), '_wp_attachment_image_alt', true ); ?>" loading="lazy">
                        </a>
                        <header class="entry-header">
                            <?php the_title('<h3 class="entry-title"><a href="' . esc_url(get_permalink()) . '" rel="bookmark">', '</a></h3>'); ?>
                            <div class="entry-meta">
                                <?php
                                posted_on();
                                posted_by();
                                ?>
                            </div>
                        </header>
                    </article>
                    <?php
                }
            }
            else {
                echo '<p>Please add some posts.</p>';
            }
            wp_reset_postdata();
            ?>
        </div>
    </section>
    <?php
}

I'm calling this throughout my theme like so:

<?php vertical_posts( 'Answers', 'answers', 4 ); ?>

I'd like to have the ability to call this function with a shortcode in the block or classic editor.

I've created the shortcode via my functions:

function register_shortcodes(){
    add_shortcode('vertical-posts', 'vertical_posts');
}
add_action( 'init', 'register_shortcodes');

Is it possible to pass the function arguments to my shortcode?

I'm thinking something along the lines of:

[vertical-posts 'Answers', 'answers', 4]
0

You can absolutely pass arguments to your shortcode, but not in the method you described. Please see the Shortcode API (https://codex.wordpress.org/Shortcode_API)

Your shortcode with arguments will look more like:

[vertical_posts label=Answers category=answers number=4]

0
0

I've created a new function for my shortcode:

<?php
function shortcode_posts( $atts ) { 
    $sc = shortcode_atts( array(
        'title' => 'Answers',
        'category' => 'answers',
        'num_of_posts' => 4
    ), $atts );
    ?>
    <section class="vertical-posts">
        <h2 class="title"><?php echo $sc['title']; ?></h2>
        <div class="post-grid">
            <?php
            $args = array('category_name'  => $sc['category'], 'posts_per_page' => $sc['num_of_posts']);
            $query = new WP_Query($args);
            if ($query->have_posts()) {
                while ($query->have_posts()) {
                    $query->the_post();
                    ?>
                    <article class="post">
                        <a class="post-thumbnail" href="<?php the_permalink(); ?>" aria-hidden="true" tabindex="-1">
                            <img src="<?php the_post_thumbnail_url('landscape-medium-1x'); ?>" alt="<?php echo get_post_meta( get_post_thumbnail_id(), '_wp_attachment_image_alt', true ); ?>" loading="lazy">
                        </a>
                        <header class="entry-header">
                            <?php the_title('<h3 class="entry-title"><a href="' . esc_url(get_permalink()) . '" rel="bookmark">', '</a></h3>'); ?>
                            <div class="entry-meta">
                                <?php
                                posted_on();
                                posted_by();
                                ?>
                            </div>
                        </header>
                    </article>
                    <?php
                }
            }
            else {
                echo '<p>Please add some posts.</p>';
            }
            wp_reset_postdata();
            ?>
        </div>
    </section>
    <?php
}

Here's how I register the shortcode:

function register_shortcodes(){
    add_shortcode('posts', 'shortcode_posts');
}
add_action( 'init', 'register_shortcodes');

I'd then call the shortcode like so:

[posts title="Answers" category="answers" num_of_posts="4"]

There's a great article from Kinsta which goes into detail about this.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.