แสดงโพสต์ยอดนิยมในเว็บไซต์ php อื่นผ่าน WP REST JSON API


9

ฉันต้องการแสดงโพสต์ที่ได้รับความนิยม & ล่าสุดในเว็บไซต์ PHP อื่นภายใต้โดเมนเดียวกัน

ตัวอย่าง:

  1. www.example.com -> เว็บไซต์หลัก (php, mysql)
  2. www.example.com/blog -> บล็อก WordPress

ต้องแสดงบล็อกโพสต์ยอดนิยมล่าสุดในเว็บไซต์หลัก

โปรดทราบว่าบล็อกและเว็บไซต์หลักใช้ฐานข้อมูลแยกกันสองฐาน

ฉันตัดสินใจใช้ปลั๊กอินWP REST JSON APIสำหรับสิ่งนั้น ตอนนี้ฉันมีคำถามที่แตกต่าง

ฉันใช้รหัสต่อไปนี้เพื่อดึงโพสต์ยอดนิยมเมื่อสัปดาห์ที่แล้ว สิ่งที่ฉันต้องการคือการได้รับข้อมูลเดียวกันนี้ผ่านการเรียก API

$args = array(
    'date_query' => array( array( 'after' => '1 week ago' ) ),  
    'posts_per_page' => $recent_posts_count,
    'ignore_sticky_posts' => 1,
    'meta_key' => 'post_views_count',
    'orderby' => 'meta_value_num',
    'order' => 'DESC'
);
$popularposts = new WP_Query( $args );

ฉันจะทำสิ่งนั้นได้อย่างไร


คำถามนี้ถูกถามบ่อยครั้ง กรุณาใช้การค้นหา
kraftner

1. หากคุณมีคำถามใหม่โปรดเปิดคำถามใหม่ ในกรณีนี้อาจไม่เป็นไรเพราะไม่ใช่เรื่องใหม่ทั้งหมด ตอนนี้ชื่อเรื่องนั้นทำให้เข้าใจผิดในตอนนี้ 2. คุณเคยเห็นเอกสาร: wp-api.org
kraftner

ฉันได้อัปเดตชื่อด้วยเช่นกัน แต่ฉันจะผ่านเอกสารขอบคุณ
Janith Chinthana

คำตอบ:


8

ผมจะให้คำตอบที่มีขนาดเล็กเพื่อการปรับปรุงของคุณทำเช่นนี้กับWP API API มีความเป็นไปได้ที่จะใช้ WP_Query เหมือนในแกนกลาง แต่เกี่ยวกับพารามิเตอร์รับใน url

URL ที่จะดึงเนื้อหาจากสถานะโพสต์จะมีลักษณะดังนี้:

http://example.com/wp-json/posts

ในการดึงเนื้อหาด้วยพารามิเตอร์ WP_Query ที่คุณคุ้นเคยคุณสามารถทำสิ่งนี้ได้:

http://example.com/wp-json/posts?filter[posts_per_page]=2&filter[order]=ASC

คุณสามารถสร้างแบบสอบถามที่กำหนดเองของคุณด้วยพารามิเตอร์ทั้งหมดได้ใน url คุณสามารถดูว่าวิธีการในการคว้าข้อมูลที่รู้สึกคุ้นเคยกับการใช้WP_Queryวนลูป WordPress มาตรฐานอย่างไร หากคุณไม่ได้ระบุพารามิเตอร์ระบบWP_Queryจะใช้ค่าเริ่มต้นเป็น

ผลลัพธ์คือ json ที่คุณสามารถวิเคราะห์และใช้สำหรับไซต์ภายนอกของคุณ

ดูที่ไซต์ของ APIสำหรับพารามิเตอร์และเอกสารเพิ่มเติม

อัพเดทสำหรับ date_query

API query_dateที่ไม่สามารถสร้างผลสำหรับการค้นหาเช่น ดูเอกสารประกอบสำหรับพารามิเตอร์ที่เป็นไปได้ทั้งหมด

แต่เวอร์ชันใหม่จะวางจำหน่ายในวันที่ดูสัปดาห์ และดูปัญหานี้สำหรับการสนทนาเกี่ยวกับวิธีแก้ปัญหาสำหรับการสืบค้นวันที่นี้ ทางเลือกใช้ตัวกรองแบบกำหนดเองผ่านทาง hook เช่น:

// Allow datequery in /posts filter
add_filter( "json_query_vars", function( $query_args ) {
    return array_merge( $query_args, 
        array( "date_query" => array( array( "after" => "1 week ago" ) ) )
    );
} );

อัพเดทสำหรับ meta_query

API ไม่สามารถใช้คุณสมบัตินี้ของ WP-Query เริ่มต้นได้ แต่คุณสามารถใช้ hook เพื่อปรับปรุง API ให้เป็นไปตามข้อกำหนดนี้ นอกจากนี้ที่นี่เป็นตัวอย่างเล็ก ๆ

add_filter('json_query_var-meta_query', 'add_meta_query', 10, 1);

function add_meta_query( $data ){

    $args = array();
    $args['relation'] = 'AND';

    foreach ( $data as $key => $value ) {
        if ( 'relation' === $key ) {
            $args['relation'] = $data['relation'];
        }

        if ( substr($key, 0, 3) === 'key' ) {
            $arg_num = substr( $key, 3 );
            $args[ (int) $arg_num ][ 'key' ] = $value;
        }

        if (  substr( $key, 0, 7 ) === 'compare' ) {
            $arg_num_comp = substr( $key, 7 );
            $args[ (int) $arg_num_comp ][ 'compare' ] = $value;
        }
    }

    return $args;
}

ตอนนี้ฉันสามารถโทรหา JSON แบบสงบเพื่อเลียนแบบตัวกรองโพสต์ Wp_query บนเซิร์ฟเวอร์แล้ว:

?filter[meta_query][key]=_newsml_categories_newsstream&filter[meta_query][key2]=homepage&filter[meta_query][relation]=AND&filter[meta_query][compare]=NOT%20EXISTS&filter[meta_query][compare2]=NOT%20EXISTS

การปรับปรุงแบบสอบถามเมตาตามคำตอบนี้


คุณมีความคิดใด ๆ วิธีแปลงบรรทัด'date_query' => array( array( 'after' => '1 week ago' ) ), เป็นสตริงเคียวรี
Janith Chinthana

ฉันต้องการยอมรับสิ่งนี้เป็นคำตอบอย่างไรก็ตามหากคุณมีความคิดเกี่ยวกับความคิดเห็นข้างต้นคุณสามารถแบ่งปันความคิดของคุณ
Janith Chinthana

ตัวกรองที่นอกเหนือจากfilter[posts_per_page]=2&filter[order]=ASCทั้งสองนี้ใช้งานไม่ได้ดังนั้นมันจึงให้โพสต์ล่าสุดเท่านั้น
Janith Chinthana

@ JanithChinthana ฉันได้ทำการทดสอบอีกครั้งตัวกรองพารามิเตอร์ทำงานได้ดี - http://localhost/wpbeta/plugins/wp-json/posts?filter[posts_per_page]=1&filter[order]=ASCตัวอย่างในฐานะที่เป็น มากขึ้นในการปรับปรุงของฉันด้านล่างในคำตอบ
bueltge

ขอบคุณสำหรับการปรับปรุงใช่post_per_pageและorderเป็นคนที่ทำงาน meta_keyแต่สิ่งที่เกี่ยวกับ มันทำงานกับสิ่งนี้หรือฉันต้องทำงานพิเศษสำหรับสิ่งนั้น
Janith Chinthana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.