php - 将链接添加到 wordpress 短代码中

标签 php html css wordpress

我有一个短代码可以在我的一个网页上发布某个类别的最新博客条目,但是我想在每个帖子的末尾显示一个静态链接,有没有办法做到这一点?

以下代码用于显示帖子:

<?php echo do_shortcode('[display-posts category="competitions" posts_per_page="4" include_excerpt="true" image_size="thumbnail" wrapper="ul"]'); 

提前致谢。

 <?php


// Create the shortcode
add_shortcode( 'display-posts', 'be_display_posts_shortcode' );
function be_display_posts_shortcode( $atts ) {

    // Original Attributes, for filters
    $original_atts = $atts;

    // Pull in shortcode attributes and set defaults
    $atts = shortcode_atts( array(
        'title'              => '',
        'author'              => '',
        'category'            => '',
        'date_format'         => '(n/j/Y)',
        'display_posts_off'   => false,
        'exclude_current'     => false,
        'id'                  => false,
        'ignore_sticky_posts' => false,
        'image_size'          => false,
        'include_title'       => true,
        'include_author'      => false,
        'include_content'     => false,
        'include_date'        => false,
        'include_excerpt'     => false,
        'meta_key'            => '',
        'meta_value'          => '',
        'no_posts_message'    => '',
        'offset'              => 0,
        'order'               => 'DESC',
        'orderby'             => 'date',
        'post_parent'         => false,
        'post_status'         => 'publish',
        'post_type'           => 'post',
        'posts_per_page'      => '10',
        'tag'                 => '',
        'tax_operator'        => 'IN',
        'tax_term'            => false,
        'taxonomy'            => false,
        'wrapper'             => 'ul',
        'wrapper_class'       => 'display-posts-listing',
        'wrapper_id'          => false,
    ), $atts, 'display-posts' );

    // End early if shortcode should be turned off
    if( $atts['display_posts_off'] )
        return;

    $shortcode_title = sanitize_text_field( $atts['title'] );
    $author = sanitize_text_field( $atts['author'] );
    $category = sanitize_text_field( $atts['category'] );
    $date_format = sanitize_text_field( $atts['date_format'] );
    $exclude_current = be_display_posts_bool( $atts['exclude_current'] );
    $id = $atts['id']; // Sanitized later as an array of integers
    $ignore_sticky_posts = be_display_posts_bool( $atts['ignore_sticky_posts'] );
    $image_size = sanitize_key( $atts['image_size'] );
    $include_title = be_display_posts_bool( $atts['include_title'] );
    $include_author = be_display_posts_bool( $atts['include_author'] );
    $include_content = be_display_posts_bool( $atts['include_content'] );
    $include_date = be_display_posts_bool( $atts['include_date'] );
    $include_excerpt = be_display_posts_bool( $atts['include_excerpt'] );
    $meta_key = sanitize_text_field( $atts['meta_key'] );
    $meta_value = sanitize_text_field( $atts['meta_value'] );
    $no_posts_message = sanitize_text_field( $atts['no_posts_message'] );
    $offset = intval( $atts['offset'] );
    $order = sanitize_key( $atts['order'] );
    $orderby = sanitize_key( $atts['orderby'] );
    $post_parent = $atts['post_parent']; // Validated later, after check for 'current'
    $post_status = $atts['post_status']; // Validated later as one of a few values
    $post_type = sanitize_text_field( $atts['post_type'] );
    $posts_per_page = intval( $atts['posts_per_page'] );
    $tag = sanitize_text_field( $atts['tag'] );
    $tax_operator = $atts['tax_operator']; // Validated later as one of a few values
    $tax_term = sanitize_text_field( $atts['tax_term'] );
    $taxonomy = sanitize_key( $atts['taxonomy'] );
    $wrapper = sanitize_text_field( $atts['wrapper'] );
    $wrapper_class = sanitize_html_class( $atts['wrapper_class'] );
    if( !empty( $wrapper_class ) )
        $wrapper_class = ' class="' . $wrapper_class . '"';
    $wrapper_id = sanitize_html_class( $atts['wrapper_id'] );
    if( !empty( $wrapper_id ) )
        $wrapper_id = ' id="' . $wrapper_id . '"';


    // Set up initial query for post
    $args = array(
        'category_name'       => $category,
        'order'               => $order,
        'orderby'             => $orderby,
        'post_type'           => explode( ',', $post_type ),
        'posts_per_page'      => $posts_per_page,
        'tag'                 => $tag,
    );

    // Ignore Sticky Posts
    if( $ignore_sticky_posts )
        $args['ignore_sticky_posts'] = true;

    // Meta key (for ordering)
    if( !empty( $meta_key ) )
        $args['meta_key'] = $meta_key;

    // Meta value (for simple meta queries)
    if( !empty( $meta_value ) )
        $args['meta_value'] = $meta_value;

    // If Post IDs
    if( $id ) {
        $posts_in = array_map( 'intval', explode( ',', $id ) );
        $args['post__in'] = $posts_in;
    }

    // If Exclude Current
    if( $exclude_current )
        $args['post__not_in'] = array( get_the_ID() );

    // Post Author
    if( !empty( $author ) )
        $args['author_name'] = $author;

    // Offset
    if( !empty( $offset ) )
        $args['offset'] = $offset;

    // Post Status  
    $post_status = explode( ', ', $post_status );       
    $validated = array();
    $available = array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash', 'any' );
    foreach ( $post_status as $unvalidated )
        if ( in_array( $unvalidated, $available ) )
            $validated[] = $unvalidated;
    if( !empty( $validated ) )      
        $args['post_status'] = $validated;


    // If taxonomy attributes, create a taxonomy query
    if ( !empty( $taxonomy ) && !empty( $tax_term ) ) {

        // Term string to array
        $tax_term = explode( ', ', $tax_term );

        // Validate operator
        if( !in_array( $tax_operator, array( 'IN', 'NOT IN', 'AND' ) ) )
            $tax_operator = 'IN';

        $tax_args = array(
            'tax_query' => array(
                array(
                    'taxonomy' => $taxonomy,
                    'field'    => 'slug',
                    'terms'    => $tax_term,
                    'operator' => $tax_operator
                )
            )
        );

        // Check for multiple taxonomy queries
        $count = 2;
        $more_tax_queries = false;
        while( 
            isset( $original_atts['taxonomy_' . $count] ) && !empty( $original_atts['taxonomy_' . $count] ) && 
            isset( $original_atts['tax_' . $count . '_term'] ) && !empty( $original_atts['tax_' . $count . '_term'] ) 
        ):

            // Sanitize values
            $more_tax_queries = true;
            $taxonomy = sanitize_key( $original_atts['taxonomy_' . $count] );
            $terms = explode( ', ', sanitize_text_field( $original_atts['tax_' . $count . '_term'] ) );
            $tax_operator = isset( $original_atts['tax_' . $count . '_operator'] ) ? $original_atts['tax_' . $count . '_operator'] : 'IN';
            $tax_operator = in_array( $tax_operator, array( 'IN', 'NOT IN', 'AND' ) ) ? $tax_operator : 'IN';

            $tax_args['tax_query'][] = array(
                'taxonomy' => $taxonomy,
                'field' => 'slug',
                'terms' => $terms,
                'operator' => $tax_operator
            );

            $count++;

        endwhile;

        if( $more_tax_queries ):
            $tax_relation = 'AND';
            if( isset( $original_atts['tax_relation'] ) && in_array( $original_atts['tax_relation'], array( 'AND', 'OR' ) ) )
                $tax_relation = $original_atts['tax_relation'];
            $args['tax_query']['relation'] = $tax_relation;
        endif;

        $args = array_merge( $args, $tax_args );
    }

    // If post parent attribute, set up parent
    if( $post_parent ) {
        if( 'current' == $post_parent ) {
            global $post;
            $post_parent = get_the_ID();
        }
        $args['post_parent'] = intval( $post_parent );
    }

    // Set up html elements used to wrap the posts. 
    // Default is ul/li, but can also be ol/li and div/div
    $wrapper_options = array( 'ul', 'ol', 'div' );
    if( ! in_array( $wrapper, $wrapper_options ) )
        $wrapper = 'ul';
    $inner_wrapper = 'div' == $wrapper ? 'div' : 'li';


    $listing = new WP_Query( apply_filters( 'display_posts_shortcode_args', $args, $original_atts ) );
    if ( ! $listing->have_posts() )
        return apply_filters( 'display_posts_shortcode_no_results', wpautop( $no_posts_message ) );

    $inner = '';
    while ( $listing->have_posts() ): $listing->the_post(); global $post;

        $image = $date = $author = $excerpt = $content = '';

        if ( $include_title )
            $title = '<a class="title" href="' . apply_filters( 'the_permalink', get_permalink() ) . '">' . get_the_title() . '</a>';

        if ( $image_size && has_post_thumbnail() )  
            $image = '<a class="image" href="' . get_permalink() . '">' . get_the_post_thumbnail( get_the_ID(), $image_size ) . '</a> ';

        if ( $include_date ) 
            $date = ' <span class="date">' . get_the_date( $date_format ) . '</span>';

        if( $include_author )
            $author = apply_filters( 'display_posts_shortcode_author', ' <span class="author">by ' . get_the_author() . '</span>' );

        if ( $include_excerpt ) 
            $excerpt = ' <span class="excerpt-dash">-</span> <span class="excerpt">' . get_the_excerpt() . '</span>';

        if( $include_content ) {
            add_filter( 'shortcode_atts_display-posts', 'be_display_posts_off', 10, 3 );
            $content = '<div class="content">' . apply_filters( 'the_content', get_the_content() ) . '</div>'; 
            remove_filter( 'shortcode_atts_display-posts', 'be_display_posts_off', 10, 3 );
        }

        $class = array( 'listing-item' );
        $class = sanitize_html_class( apply_filters( 'display_posts_shortcode_post_class', $class, $post, $listing, $original_atts ) );
        $output = '<' . $inner_wrapper . ' class="' . implode( ' ', $class ) . '">' . $image . $title . $date . $author . $excerpt . $content . '</' . $inner_wrapper . '>';

        // If post is set to private, only show to logged in users
        if( 'private' == get_post_status( get_the_ID() ) && !current_user_can( 'read_private_posts' ) )
            $output = '';

        $inner .= apply_filters( 'display_posts_shortcode_output', $output, $original_atts, $image, $title, $date, $excerpt, $inner_wrapper, $content, $class );

    endwhile; wp_reset_postdata();

    $open = apply_filters( 'display_posts_shortcode_wrapper_open', '<' . $wrapper . $wrapper_class . $wrapper_id . '>', $original_atts );
    $close = apply_filters( 'display_posts_shortcode_wrapper_close', '</' . $wrapper . '>', $original_atts );

    $return = $open;

    if( $shortcode_title ) {

        $title_tag = apply_filters( 'display_posts_shortcode_title_tag', 'h2', $original_atts );

        $return .= '<' . $title_tag . ' class="display-posts-title">' . $shortcode_title . '</' . $title_tag . '>' . "\n";
    }

    $return .= $inner . $close;

    return $return;
}

/**
 * Turn off display posts shortcode 
 * If display full post content, any uses of [display-posts] are disabled
 *
 * @param array $out, returned shortcode values 
 * @param array $pairs, list of supported attributes and their defaults 
 * @param array $atts, original shortcode attributes 
 * @return array $out
 */
function be_display_posts_off( $out, $pairs, $atts ) {
    $out['display_posts_off'] = true;
    return $out;
}

/**
 * Convert string to boolean
 * because (bool) "false" == true
 *
 */
function be_display_posts_bool( $value ) {
    return !empty( $value ) && 'true' == $value ? true : false;
}

最佳答案

您需要编辑您在上面给出的代码的第 243 行的 $output 变量。

添加静态 url 的简单修改就可以了,如下所示:

$static_link = 'http://www.test.com/test';
$output = '<' . $inner_wrapper . ' class="' . implode( ' ', $class ) . '">' . $image . $title . $date . $author . $excerpt . $content . '<a href="'.$static_link.'">Read more</a>' . '</' . $inner_wrapper . '>';

根据您的要求对此进行修改,例如添加来自数据库的正确链接。

希望这对您有所帮助。

关于php - 将链接添加到 wordpress 短代码中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27247732/

相关文章:

php - Sulu 不显示模板更改

javascript - 根据一个子jquery单独隐藏下拉菜单

html - Firefox CSS 空白 :nowrap not being honoured

css - <div> 中元素的定位

php - jquery 函数只能工作一次?

PHP 套接字流 gzip 数据

php - jQuery AJAX 请求中的相对与绝对 url

jQuery 在按钮单击时获取输入值

html - 根据屏幕自动调整图像

javascript - 最大高度在表格标题上无法正常工作