php中get_adjacent_post函數PHP源碼閱讀筆記

來源:互聯網
上載者:User

這個函數是wordpress裡的一個函數,作用是擷取相鄰的POST文章。

函數並不大,有效代碼大概只有70行左右,但是裡麵包含的知識不少,所以專門用一篇文章來解釋一下。

get_adjacent_post函數的源碼位於wp-includes/link-template.php中。

我會通過“//roc:”在引出源碼閱讀筆記。

/**
 * Retrieve adjacent post.
 *
 * Can either be next or previous post.
 *
 * @since 2.5.0
 *
 * @param bool $in_same_cat Optional. Whether post should be in a same category.
 * @param array|string $excluded_categories Optional. Array or comma-separated list of excluded category IDs.
 * @param bool $previous Optional. Whether to retrieve previous post.                                                            
 * @return mixed Post object if successful. Null if global $post is not set. Empty string if no corresponding post exists.
 */
【筆記】

上面這一段是函數的介紹資訊,這個函數包括三個參數:

1 $in_same_cat參數,表示是否需要在同一category中,預設為false。

2 $excluded_categories參數,用於設定忽略哪些category中的post。可以將category ID組成array或comma-separated list的方式來賦值。

3 $previous參數,表示是否提取前一篇post。預設為true。如果希望提取後一篇post,需則設定為false。

此函數的傳回值也有三種情況:

1 返回post object,則表明成功;

2 返回NULL,則表明全域$post未設定;

3 返回Null 字元串,則表明相應的post不存在。

function get_adjacent_post( $in_same_cat = false, $excluded_categories = "", $previous = true ) {
    global $wpdb;
【筆記】

這裡聲明了$wpdb全域變數,這個變數其實很有來頭的,它是wordpress自身為開發人員提供的公有全域變數,開發人員們可以直接利用這個函數來對資料庫進行操作,包括建立、刪除、添加、更新等等。

需要注意的是,如果想使用這個“萬能鑰匙”,需要在自己的函數中向上面這樣聲明一下這個變數。

另外,在正常情況下,$wpdb變數只有許可權訪問部落格所對應的一個資料庫,對其他資料庫是沒有許可權的。

比如想查詢資料庫中的表內容,那麼可以這樣:

if ( ! $post = get_post() )        return null;
    $current_post_date = $post->post_date;

    $join = "";
    $posts_in_ex_cats_sql = "";
    if ( $in_same_cat || ! empty( $excluded_categories ) ) {
        $join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";

        if ( $in_same_cat ) {
            if ( ! is_object_in_taxonomy( $post->post_type, "category" ) )
                return "";
            $cat_array = wp_get_object_terms($post->ID, "category", array("fields" => "ids"));
            if ( ! $cat_array || is_wp_error( $cat_array ) )
                return "";
            $join .= " AND tt.taxonomy = "category" AND tt.term_id IN (" . implode(",", $cat_array) . ")";
        }   

        $posts_in_ex_cats_sql = "AND tt.taxonomy = "category"";
        if ( ! empty( $excluded_categories ) ) {
            if ( ! is_array( $excluded_categories ) ) {
                // back-compat, $excluded_categories used to be IDs separated by " and "
                if ( strpos( $excluded_categories, " and " ) !== false ) {
                    _deprecated_argument( __FUNCTION__, "3.3", sprintf( __( "Use commas instead of %s to separate excluded categories." ), ""and"" ) );
                    $excluded_categories = explode( " and ", $excluded_categories );
                } else {
                    $excluded_categories = explode( ",", $excluded_categories );
                }
            }

            $excluded_categories = array_map( "intval", $excluded_categories );

            if ( ! empty( $cat_array ) ) {
                $excluded_categories = array_diff($excluded_categories, $cat_array);
                $posts_in_ex_cats_sql = "";
            }

            if ( !empty($excluded_categories) ) {
                $posts_in_ex_cats_sql = " AND tt.taxonomy = "category" AND tt.term_id NOT IN (" . implode($excluded_categories, ",") . ")";
            }
        }
    }

    $adjacent = $previous ? "previous" : "next";
    $op = $previous ? "<" : ">";
    $order = $previous ? "DESC" : "ASC";

    $join  = apply_filters( "get_{$adjacent}_post_join", $join, $in_same_cat, $excluded_categories );
    $where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = "publish" $posts_in_ex_cats_sql", $current_post_date, $post->post_type), $in_same_cat, $excluded_categories );
    $sort  = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1" );

    $query = "SELECT p.id FROM $wpdb->posts AS p $join $where $sort";
    $query_key = "adjacent_post_" . md5($query);
    $result = wp_cache_get($query_key, "counts");
    if ( false !== $result ) {
        if ( $result )
            $result = get_post( $result );
        return $result;
    }

    $result = $wpdb->get_var( $query );
    if ( null === $result )
        $result = "";

    wp_cache_set($query_key, $result, "counts");

    if ( $result )
        $result = get_post( $result );

    return $result;
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.