Các tính năng của Sticky Post có thể bạn chưa biết Trong WordPress

image

Bạn có biết rằng WordPress cho phép bạn làm nổi bật các bài đăng của mình bằng cách sử dụng tính năng bài đăng dính . Tuy nhiên, bài viết dính là một trong những tính năng ít được biết đến nhất của WordPress. Trong bài viết này, chúng tôi sẽ chỉ cho bạn 6 điều thú vị mà bạn có thể làm với các bài đăng dính trong WordPress.

1. Tự động hết hạn các bài đăng dính

Nếu bạn đang sử dụng các bài đăng cố định để đánh dấu một sự kiện hoặc phiếu giảm giá đặc biệt, thì bạn sẽ cần phải hủy dán bài đăng sau khi sự kiện đó kết thúc.

Điều này nghe có vẻ giống như công việc không cần thiết mà bạn nên tự động hóa.

Chỉ cần cài đặt và kích hoạt plugin Expire Sticky Posts . Sau khi kích hoạt, bạn có thể đặt ngày hết hạn cho các bài đăng dính.

Sau khi hết hạn, bài dính của bạn sẽ tự động trở thành bài bình thường.

2. Bài đăng hấp dẫn cho danh mục

Theo mặc định, các bài đăng dính chỉ xuất hiện trên trang đầu của trang web của bạn. Nhưng nếu bạn muốn hiển thị nội dung nổi bật trên các trang lưu trữ danh mục của mình thì sao?

Bạn có thể làm điều đó bằng cách cài đặt và kích hoạt plugin Category Sticky Post . Sau khi kích hoạt, hãy chỉnh sửa một bài đăng mà bạn muốn làm nổi bật và chọn danh mục bài đăng hấp dẫn.

3. Hiển thị các bài đăng dính mới nhất

Thông thường, các bài đăng dính được sử dụng cho các bài đăng nổi bật để hiển thị nội dung nổi bật nhất của bạn. Nhưng sau một thời gian, các bài đăng nổi bật cũ của bạn biến mất trong kho lưu trữ. Bạn có thể làm sống lại nội dung nổi bật cũ của mình bằng cách hiển thị chúng trên trang lưu trữ tùy chỉnh hoặc bất kỳ nơi nào khác trên trang web của bạn.

Chỉ cần dán mã này vào tệp functions.php của chủ đề của bạn hoặc một plugin WordPress dành riêng cho trang web .

function wpb_latest_sticky() {

/* Get all sticky posts */
$sticky = get_option( 'sticky_posts' );

/* Sort the stickies with the newest ones at the top */
rsort( $sticky );

/* Get the 5 newest stickies (change 5 for a different number) */
$sticky = array_slice( $sticky, 0, 5 );

/* Query sticky posts */
$the_query = new WP_Query( array( 'post__in' => $sticky, 'ignore_sticky_posts' => 1 ) );
// The Loop
if ( $the_query->have_posts() ) {
    $return .= '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        $return .= '<li><a href="' .get_permalink(). '" title="'  . get_the_title() . '">' . get_the_title() . '</a><br />' . get_the_excerpt(). '</li>';

    }
    $return .= '</ul>';

} else {
    // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();

return $return;

}
add_shortcode('latest_stickies', 'wpb_latest_sticky');

Sau khi thêm mã này, chỉ cần tạo thêm mã ngắn [latest_stickies] ở bất cứ đâu bạn muốn để hiển thị các bài đăng dính mới nhất của mình.

4. Bài đăng dính cho các loại bài đăng tùy chỉnh

Tính năng bài đăng dính chỉ khả dụng cho các bài đăng WordPress, nhưng điều này không có nghĩa là bạn không thể thêm tính năng này cho các loại bài đăng khác .

Chỉ cần cài đặt và kích hoạt plugin Loại bài đăng tùy chỉnh dính . Khi bạn đã kích hoạt plugin, hãy truy cập Cài đặt »Đọc và bật bài đăng cố định cho bất kỳ loại bài đăng nào bạn muốn.

5. Cách ẩn các bài viết dính trên WordPress Loop

Khi sử dụng các bài đăng dính, bạn sẽ nhận thấy rằng theo mặc định, WordPress hiển thị bài đăng dính của bạn ở đầu tất cả các bài đăng WordPress của bạn. Ví dụ: nếu bạn có một vòng lặp để hiển thị các bài đăng gần đây, thì các bài đăng hấp dẫn sẽ xuất hiện trên đầu bất kể chúng được thêm vào khi nào.

Để tránh điều này, chỉ cần sử dụng ignore_sticky_posts đối số trong truy vấn WordPress của bạn, như sau:

<?php
$args = array(
    'posts_per_page' => 10,
    'ignore_sticky_posts' => 1
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();
?>

PHP

6. Tạo kiểu bài viết dính

Bạn muốn thêm kiểu tùy chỉnh vào các bài viết cố định của mình?

Nhiều chủ đề WordPress sử dụng post_class() chức năng tự động thêm các lớp bài đăng cho mỗi bài đăng. Nếu chủ đề của bạn đã sử dụng hàm post_class(), thì bạn sẽ thấy lớp hấp dẫn được thêm vào các bài viết hấp dẫn của mình.

Nếu chủ đề của bạn không thêm lớp dính vào div vùng chứa bài đăng, thì bạn có thể tự thêm lớp đó bằng cách thêm hàm post_class () vào div bài đăng hoặc vùng chứa bài viết.

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

Bây giờ bạn có thể sử dụng. sticky Lớp CSS trong biểu định kiểu của chủ đề con của bạn . Đây là một số CSS cơ bản để giúp bạn bắt đầu:

.sticky {
background-color:#ededed;
border:1 px solid #f5f5f5;
color:#272727;
padding:5px;
}

.sticky:before {
  content: "Featured";
  color: #FFF;
  background: #f20000;
  padding: 10px;
  display: inline-block;
  text-align: right;
  float: right;
  font-weight: bold;
  text-transform: uppercase;
}

Đây là cách nó trông trên trang demo của chúng tôi bằng cách sử dụng chủ đề Twenty Twelve.

Đó là tất cả, chúng tôi hy vọng bài viết này đã giúp bạn tìm hiểu một số điều thú vị để làm với các bài đăng dính trên trang web WordPress của bạn.

Tùy chỉnh Sticky Post trong WordPress

Trong WordPress có một chức năng mặc định được xây dựng từ phiên bản 2.7 trở đi, được kích hoạt khi bạn …

Trong WordPress có một chức năng mặc định được xây dựng từ phiên bản 2.7 trở đi, được kích hoạt khi bạn bấm vào >> Thêm bài viết >> Chế độ. Và đúng như cái tên của nó, sticky post là chức năng dán bài viết lên đầu danh sách và cho dù nó có cũ thì cũng không bị đẩy xuống, dùng để làm bài viết tiêu biểu hoặc thông báo, hoặc định hướng người đọc cũng đều okey hết !

Như lần trước tôi có thiết kế một website tin tức cho bạn tôi, tôi dùng chức năng sticky post này để dán nhãn cho các hot trends hiển thị, tất nhiên là các query bài viết cần phải thêm “ignore_sticky_posts” vào để không include lại lần nữa các bài viết này.

Các sticky post được lưu thành chuỗi và được gọi ra bởi hàm get_option(‘sticky’), như vậy, nếu bạn muốn lấy toàn bộ nó ra thì chỉ cần gọi hàm đó là ta có danh sách, sau đây là vài đoạn ứng dụng vui vui nếu các bạn có thể sử dụng được thì hay:

Hiển thị các bài viết được sticky:

$sticky = get_option( 'sticky_posts' );
$query = new WP_Query( 'p=' . $sticky[0] );

Hoặc hiển thị các bài đăng được dán nhưng nếu không có thì hiển thị các bài viết khác:

$args = array(
	'posts_per_page' => 1,
	'post__in'  => get_option( 'sticky_posts' ),
	'ignore_sticky_posts' => 1
);
$query = new WP_Query( $args );

Không hiển thị các bài được sticky trước đó:

$query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );

Hoặc không hiển thị sticky post trong một category, có thêm phân trang:

$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$sticky = get_option( 'sticky_posts' );
$args = array(
	'cat' => 3,
	'ignore_sticky_posts' => 1,
	'post__not_in' => $sticky,
	'paged' => $paged
);
$query = new WP_Query( $args );

Hoặc đoạn code sau sẽ hiển thị 5 bài được sticky mới nhất:

<?php
/* Get all Sticky Posts */
$sticky = get_option( 'sticky_posts' );

/* Sort Sticky Posts, newest at the top */
rsort( $sticky );

/* Get top 5 Sticky Posts */
$sticky = array_slice( $sticky, 0, 5 );

/* Query Sticky Posts */
$query = new WP_Query( array( 'post__in' => $sticky, 'ignore_sticky_posts' => 1 ) );
?>

Chúc các bạn thành công !

Sticky Post nâng cao trong WordPress

Sticky post là chức năng mới của WordPress, bài đăng nào được dán nhãn Sticky sẽ được đứng đầu danh sách bài …

Sticky post là chức năng mới của WordPress, bài đăng nào được dán nhãn Sticky sẽ được đứng đầu danh sách bài đăng trong trang chủ, trong category và trong danh sách tag, hoặc tất cả các query khác nếu không cho thêm “ignore sticky post” vào, đồng nghĩa với việc bạn sẽ lúng túng khi các bài sticky xuất hiện ở khắp nơi trên trang.

Công việc của chúng ta hôm nay sẽ là:

  • Không hiển thị sticky post trên toàn bộ các query
  • Lấy danh sách sticky và hiển thị đúng nơi, đúng chỗ cần

Sticky trên trang chủ

Trong WordPress có một hook tên là “pre_get_post” dùng để lọc các query trước khi thực thi, chúng ta sẽ can thiệp vào query chính của Homepage để không hiển thị sticky post:

add_action('pre_get_posts','wpse74620_ignore_sticky');function wpse74620_ignore_sticky($query){if(is_home()&& $query->is_main_query())
        $query->set('ignore_sticky_posts',true);}

Hoặc có thêm cách thứ hai:

function theme_name_ignore_sticky_posts($query){
if(is_home()&& $query->is_main_query())
    $query->set('post__not_in', get_option('sticky_posts'));}
add_action('pre_get_posts','theme_name_ignore_sticky_posts');

Hai hàm này bạn có thể cho nó vào file function.php của gói giao diện đang chạy, tiếp theo, nếu bạn muốn làm với category hay với tag đều dùng cách này.

Ứng dụng vào trang

Đến đây bạn đã chắc là không còn một tên sticky post nào đang hiển thị trên toàn bộ các query, bạn sẽ lấy danh sách sticky post này bằng hàm get_option(‘sticky’); tiếp theo nữa, một query chuyên hiển thị phần này sẽ được lập trình để nó chỉ hiển thị sticky post chứ không phải cái gì khác, các bạn có thể ứng dụng điều này để hiển thị bài đăng nổi bật hoặc hot trends …. trong các giao diện tạp chí.

$args = array( 'posts_per_page' => 1, 'post__in' => get_option( 'sticky_posts' ), 'ignore_sticky_posts' => 1 ); $query = new WP_Query( $args );

Bạn phải nhớ cho thêm ignore sticky posts vào để cho query không phụ thuộc vào các sticky post trước đó, giúp bạn dễ dàng lọc được kết quả hơn !

Mình vừa làm cái hot trends trên blog đó :grinning: các bạn có thể ứng dụng cách này vào trong slide, trong bài viết đáng lưu ý hoặc bất kỳ cái gì các bạn định nghĩa nhé !

Chúc các bạn thành công !

Sticky Posts

A Sticky Post is the post will be placed at the top of the front page of posts. This feature is only available for the built-in post type post and not for custom post types.

How to stick a post

  1. Go to Administration Screen > Posts > Add New or Edit
  2. In the right side menu, Click Edit link of Visibility option in Publish group
  3. Click Stick this post to the front page option

Display Sticky Posts

Show Sticky Posts

Display just the first sticky post. At least one post must be designated as a “sticky post” or else the loop will display all posts:

$sticky = get_option( 'sticky_posts' );
$query = new WP_Query( 'p=' . $sticky[0] );

Display just the first sticky post, if none return the last post published:

$args = array(
        'posts_per_page' => 1,
        'post__in' => get_option( 'sticky_posts' ),
        'ignore_sticky_posts' => 1
);
$query = new WP_Query( $args );

Display just the first sticky post, if none return nothing:

$sticky = get_option( 'sticky_posts' );
$args = array(
        'posts_per_page' => 1,
        'post__in' => $sticky,
        'ignore_sticky_posts' => 1
);
$query = new WP_Query( $args );
if ( isset( $sticky[0] ) ) {
    // insert here your stuff...
}

Don’t Show Sticky Posts

Exclude all sticky posts from the query:

$query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );

Exclude sticky posts from a category. Return ALL posts within the category, but don’t show sticky posts at the top. The ‘sticky posts’ will still show in their natural position (e.g. by date):

$query = new WP_Query( 'ignore_sticky_posts=1&posts_per_page=3&cat=6' );

Exclude sticky posts from a category. Return posts within the category, but exclude sticky posts completely, and adhere to paging rules:

$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$sticky = get_option( 'sticky_posts' );
$args = array(
        'cat' => 3,
        'ignore_sticky_posts' => 1,
        'post__not_in' => $sticky,
        'paged' => $paged
);
$query = new WP_Query( $args );

Note:Use get_query_var( ‘page’ ) if you want this query to work in a Page template that you’ve set as your static front page.

<?php
/* Get all Sticky Posts */
$sticky = get_option( 'sticky_posts' );
 
/* Sort Sticky Posts, newest at the top */
rsort( $sticky );
 
/* Get top 5 Sticky Posts */
$sticky = array_slice( $sticky, 0, 5 );
 
/* Query Sticky Posts */
$query = new WP_Query( array( 'post__in' => $sticky, 'ignore_sticky_posts' => 1 ) );
?>

Style Sticky Posts

To help theme authors perform simpler styling, the post_class() function is used to add class=”…” to DIV, just add:

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

The post_class() outputs the class=”whatever” piece for that div. This includes several different classes of value: post, hentry (for hAtom microformat pages), category-X (where X is the slug of every category the post is in), and tag-X (similar, but with tags). It also adds “sticky” for posts marked as Sticky Posts.

.sticky { color:red; }

Note:The “sticky” class is only added for sticky posts on the first page of the home page (is_home() is true and is_paged() is false)

<?php

/* copy commenty stuff here from existing version of plugin */

class PD_StickyPostsInCategory {
    function PD_StickyPostsInCategory() {
        return $this->__construct();
    }

    function __construct() {
        define('PD_SPIC_VERSION', '2.1');
        //e.g. /var/www/example.com/wordpress/wp-content/plugins/exit-crusher
        define("PD_SPIC_DIR", plugin_dir_path(__FILE__));
        //e.g. exit-crusher/exit-crusher.php
        define("PD_SPIC_BASENAME", plugin_basename(__FILE__));

        add_filter('the_posts', array(
            $this,
            'putStickyOnTop'
        ));
        add_filter('post_class', array(
            $this,
            'addStickyClass'
        ) , 10, 3);
    }

    function putStickyOnTop($posts)

 {
        $page = 1;
        if (empty($wp_query->query_vars['nopaging']) && !$wp_query->is_singular) {
            $page = absint($wp_query->query_vars['paged']);

            if (!$page) {
                $page = 1;
            }
        }

        // Put sticky posts at the top of the posts array
        $sticky_posts = get_option('sticky_posts');
        $current_category = get_cat_ID(single_term_title('', false));
        if ($page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$wp_query->query_vars['ignore_sticky_posts']) {
            $num_posts = count($posts);
            $sticky_offset = 0;
            // Loop over posts and relocate stickies to the front.
            for ($i = 0;$i < $num_posts;$i++) {
                if (in_array($posts[$i]->ID, $sticky_posts)) {
                    $sticky_post = $posts[$i];
                    // Remove sticky from current position
                    array_splice($posts, $i, 1);
                    // Move to front, after other stickies
                    array_splice($posts, $sticky_offset, 0, array(
                        $sticky_post
                    ));
                    // Increment the sticky offset. The next sticky will be placed at this offset.
                    $sticky_offset++;
                    // Remove post from sticky posts array
                    $offset = array_search($sticky_post->ID, $sticky_posts);
                    unset($sticky_posts[$offset]);
                }
            }

            // If any posts have been excluded specifically, Ignore those that are sticky.
            if (!empty($sticky_posts) && !empty($q['post__not_in'])) {
                $sticky_posts = array_diff($sticky_posts, $q['post__not_in']);
            }

            // Fetch sticky posts that weren't in the query results
            if (!empty($sticky_posts) && !is_user_logged_in() && is_category()) {
                // Prevent maximum function nesting level error
                remove_filter('the_posts', array(
                    $this,
                    'the_posts'
                ) , 1, 2);

                $stickies = get_posts(array(
                    'post__in' => $sticky_posts,
                    'post_type' => $wp_query->query_vars['post_type'],
                    'post_status' => 'publish',
					'cat' => $current_category,
                    'nopaging' => true
                ));

                add_filter('the_posts', array(
                    $this,
                    'the_posts'
                ) , 1, 2);

                foreach ($stickies as $sticky_post) {
                    array_splice($posts, $sticky_offset, 0, array(
                        $sticky_post
                    ));
                    $sticky_offset++;
                }
            }
        }

        return $posts;

    }

    function addStickyClass($classes, $class, $post_id) {
        if (is_sticky() && !isset($classes['sticky'])) {
            $classes[] = 'sticky';
        }
        return $classes;
    }

    function activate() {
    }
}

$PD_StickyPostsInCategory = new PD_StickyPostsInCategory();

register_activation_hook(__FILE__, array(
    'PD_StickyPostsInCategory',
    'activate'
));
/* Display custom column */
function display_posts_stickiness( $column, $post_id ) {
    if ($column == 'sticky'){
        echo '<input type="checkbox" disabled', ( is_sticky( $post_id ) ? ' checked' : ''), '/>';
    }
}
add_action( 'manage_posts_custom_column' , 'display_posts_stickiness', 10, 2 );

/* Add custom column to post list */
function add_sticky_column( $columns ) {
    return array_merge( $columns, 
        array( 'sticky' => __( 'Sticky', 'your_text_domain' ) ) );
}
add_filter( 'manage_posts_columns' , 'add_sticky_column' );
<?php

/*
 * =================================================================================================
 *          Below both hooks works for custom post types.
 *          e.g. Suppose we have custom post-type name : Books
 * 	    @ref https://codex.wordpress.org/Plugin_API/Action_Reference/manage_$post_type_posts_custom_column
 * =================================================================================================
 */

/* Add custom column to book list */
function add_sticky_column( $columns ) {
    return array_merge( $columns, 
        array( 'sticky' => __( 'Sticky', 'your_text_domain' ) ) );
}
add_filter( 'manage_book_posts_columns' , 'add_sticky_column' );

/* Add content to above added custom column */
function book_posts_stickiness( $column, $post_id ) {
    if ($column == 'sticky'){
        // Your custom code goes here
    }
}
add_action( 'manage_book_posts_custom_column' , 'book_posts_stickiness', 10, 2 );

/*
 * =================================================================================================
 *          After adding custom column above it's time to SORT of that field.
 * 	    @ref https://code.tutsplus.com/articles/quick-tip-make-your-custom-column-sortable--wp-25095
 * =================================================================================================
 */

// make it sortable
function book_sortable_columns( $columns ) {
	$columns['slices'] = 'slice';
	return $columns;
}
add_filter( 'manage_edit-book_sortable_columns', 'book_sortable_columns' );


function book_slice_orderby( $query ) {
    if( ! is_admin() )
        return;
 
    $orderby = $query->get( 'orderby');
 
    if( 'slice' == $orderby ) {
        $query->set('meta_key','slices');
        $query->set('orderby','meta_value_num'); // "meta_value_num" is used for numeric sorting
                                                 // "meta_value"     is used for Alphabetically sort.
        
        // We can user any query params which used in WP_Query.
    }
}
add_action( 'pre_get_posts', 'book_slice_orderby' );



/*
 * =================================================================================================
 *          Below both hooks works for built in (posts) post-type only.
 *	    @ref https://codex.wordpress.org/Plugin_API/Action_Reference/manage_posts_custom_column
 * =================================================================================================
 */
/* Add custom column to post list */
function add_sticky_column( $columns ) {
    return array_merge( $columns, 
        array( 'sticky' => __( 'Sticky', 'your_text_domain' ) ) );
}
add_filter( 'manage_posts_columns' , 'add_sticky_column' );

/* Add content to above added custom column */
function display_posts_stickiness( $column, $post_id ) {
    if ($column == 'sticky'){
        // Your custom code goes here
    }
}
add_action( 'manage_posts_custom_column' , 'display_posts_stickiness', 10, 2 );
1 Lượt thích
1 Lượt thích

Anh Tuấn hỗ trợ get theme giúp e với ạ! các topic get theme không thấy ban quản trị rep! :smiley: