如果循环中不存在帖子,则显示一条消息

时间:2016-07-01 作者:I.Alex

我有一个书签/收藏夹帖子的循环,对于一个新帐户,如果您在书签页面上没有书签帖子,则会显示以下消息:Bummer,no bookmarks posts!

在新帐号添加1个帖子到书签后,帖子会出现在书签页面上,一切都很好。

但是,如果新帐号从他的书签帖子中删除了一条书签帖子,那么页面上将显示wordpress的所有帖子,而不是这条消息:糟糕,没有书签帖子!

我需要设置什么来显示相同的消息,而不是wordpress的所有帖子?

这是我的循环:

<?php
                if(!is_user_logged_in() ) {
                    ?>
                    <div class="side-article">
                        <h2><?php _e(\'Please login if you want to see bookmarked posts!\', \'Aruna\');?></h2>
                    </div>
                <?php }
                else {
        $current_user = wp_get_current_user();
        $bookmarks = get_user_meta($current_user->ID, \'bookmarks\', true);
        if($bookmarks) { 
        $bookmarks = unserialize($bookmarks);
        //Bookmarks                          
        $args = array();
        $args[\'post_type\'] = \'post\';
        $args[\'post__in\'] = $bookmarks;
        $args[\'order\'] = \'DESC\';
        $args[\'posts_per_page\'] = 8;
        //performance improvements
        $args[\'no_found_rows\'] = true;
        $args[\'update_post_term_cache\'] = true;
        $args[\'update_post_meta_cache\'] = true;

        $paged = is_front_page() ? get_query_var( \'page\' ) : get_query_var( \'paged\' );
        $args[\'paged\'] = $paged;
        $wp_query = new WP_Query($args);
        if ($wp_query->have_posts()) :
        while ($wp_query->have_posts()) : $wp_query->the_post();
        get_template_part( \'content\', get_post_format() );
        endwhile; wp_reset_postdata();  
        get_template_part(\'includes/pagination\');   
        endif;
        ?>
        <?php
        } else { ?>
        <div>
        <h2><?php _e("Bummer, no bookmarks posts!", \'Aruna\');?></h2>
        </div>
       <?php }
       } ?>
功能。php:

function teo_bookmark_submit() {
    // get the submitted parameters
    $postID = $_POST[\'post_id\'];

    $current_user = wp_get_current_user();
    $bookmarks = get_user_meta($current_user->ID, \'bookmarks\', true);
    if(empty($bookmarks) ) {
        $bookmarks = array();
    }
    else {
        $bookmarks = unserialize($bookmarks);
    }
    if(!in_array($postID, $bookmarks) ) {
        $bookmarks[] = $postID;
    }
    $bookmarks = serialize($bookmarks);
    update_user_meta($current_user->ID, \'bookmarks\', $bookmarks);
    exit;
}

function teo_bookmark_remove() {
    // get the submitted parameters
    $postID = $_POST[\'post_id\'];

    $current_user = wp_get_current_user();
    $bookmarks = get_user_meta($current_user->ID, \'bookmarks\', true);
    $bookmarks = unserialize($bookmarks);

    if(in_array($postID, $bookmarks) ) {
        $index = array_search($postID, $bookmarks);
        unset($bookmarks[$index]);
    }

    $bookmarks = serialize($bookmarks);
    update_user_meta($current_user->ID, \'bookmarks\', $bookmarks);
    exit;
}

1 个回复
SO网友:CK MacLeod

好的,首先,您不需要序列化/取消序列化。get_user_meta() 将返回一个数组,并且delete_user_meta() 可以删除特定值。

因此,简化这里和下面的其他一些内容,您的remove函数的工作方式如下(非常简单):

function teo_bookmark_remove() {

    $postID = $_POST[\'post_id\'];
    $current_user = get_current_user_id();

    delete_user_meta( $current_user, \'bookmarks\', $postID );

}
同样,bookmarks submit:非常简单(虽然可能在这里和之前的函数中,您应该使用nonces或其他安全功能-不确定其余设置如何处理此问题):

function teo_bookmark_submit() {

    // get the submitted parameters
    $postID = $_POST[\'post_id\'];
    $current_user = get_current_user_id();

    update_user_meta( $current_user, \'bookmarks\', $postID );

}
现在显示功能:

if (!is_user_logged_in() ) {

    ?>
    <div class="side-article">
        <h2><?php _e(\'Please login if you want to see bookmarked posts!\', \'Aruna\');?></h2>
    </div>

    <?php } else {

    $current_user = get_current_user_id();
    $bookmarks = get_user_meta($current_user, \'bookmarks\'); //returns array

    if ( ! empty($bookmarks) ) { 

            $args = array();
            $args[\'post_type\'] = \'post\';
            $args[\'post__in\'] = $bookmarks; //post__in takes array
            $args[\'order\'] = \'DESC\';
            $args[\'posts_per_page\'] = 8;
            //performance improvements
            $args[\'no_found_rows\'] = true;
            $args[\'update_post_term_cache\'] = true;
            $args[\'update_post_meta_cache\'] = true;

    $paged = is_front_page() ? get_query_var( \'page\' ) : get_query_var( \'paged\' );
    $args[\'paged\'] = $paged;

    $wp_query = new WP_Query($args);

    if ($wp_query->have_posts()) {
        while ($wp_query->have_posts()) : $wp_query->the_post();

            get_template_part( \'content\', get_post_format() );

        endwhile; 

        wp_reset_postdata();  

        get_template_part(\'includes/pagination\');   

    }

} else { ?>

    <div>
        <h2><?php _e("Bummer, no bookmarks posts!", \'Aruna\');?></h2>
    </div>

   <?php }

} 
测试了“无书签”部分-给您带来问题的部分。当然,不能完全保证$bookmarks非空选项的结果,但可以使用简单的is_empty测试。

注意:我相信在上述函数中,相同的值最终可能会在“bookmarks”数组中出现多次。我认为post\\u in或delete\\u post\\u meta(将删除与键相关的特定值的所有实例)不会有问题,但如果您将“bookmarks”数组用于其他目的,则可能会有问题。如果需要的话,不难解决。