Bagaimana cara memperpanjang WP_Query untuk memasukkan tabel khusus dalam kueri?


31

Saya sudah berhari-hari membahas masalah ini sekarang. Awalnya itu adalah, bagaimana cara menyimpan data pengikut pengguna dalam database, yang saya dapatkan beberapa rekomendasi bagus di sini di WordPress Answers. Setelah, mengikuti rekomendasi saya telah menambahkan tabel baru seperti ini:

id  leader_id   follower_id
1   2           4
2   3           10
3   2           10

Pada tabel di atas, baris pertama memiliki pengguna dengan ID 2 yang sedang diikuti oleh pengguna dengan ID 4. Di baris kedua, pengguna dengan ID 3 sedang diikuti oleh pengguna dengan ID 10. Logika yang sama berlaku untuk baris ketiga.

Sekarang, pada dasarnya saya ingin memperluas WP_Query sehingga saya dapat membatasi posting yang diambil dari, hanya oleh pemimpin pengguna. Jadi, dengan mempertimbangkan tabel di atas, jika saya harus memberikan ID pengguna 10 ke WP_Query hasilnya hanya akan berisi posting dengan ID pengguna 2 dan ID pengguna 3.

Saya telah mencari banyak berusaha untuk menemukan jawaban. Saya juga tidak melihat tutorial apa pun untuk membantu saya memahami cara memperluas kelas WP_Query. Saya telah melihat jawaban Mike Schinkel (memperluas WP_Query) untuk pertanyaan serupa, tetapi saya benar-benar tidak mengerti bagaimana menerapkannya pada kebutuhan saya. Akan lebih bagus jika seseorang bisa membantu saya dengan ini.

Tautan ke jawaban Mike seperti yang diminta: Tautan 1 , Tautan 2


Tolong, tambahkan tautan ke jawaban Mikes.
kaiser

1
dapatkah Anda memberikan contoh apa yang ingin Anda tanyakan? WP_Queryadalah untuk mendapatkan posting, dan saya gagal memahami bagaimana ini terkait dengan posting.
mor7ifer

@kaiser Saya telah memperbarui pertanyaan dengan tautan ke jawaban Mike.
John

@ m0r7if3r »Saya ingin memperluas WP_Query sehingga saya dapat membatasi posting yang diambil dari, hanya oleh pemimpin (s) dari pengguna«, sangat mirip dengan "dapatkan posting oleh penulis".
kaiser

2
@ m0r7if3r Posting persis seperti yang saya butuhkan untuk kueri. Tetapi posting yang akan diambil harus oleh pengguna yang terdaftar sebagai pemimpin pengguna tertentu di tabel kustom. Jadi, dengan kata lain saya ingin memberi tahu WP_Query, ambil semua posting oleh semua pengguna yang terdaftar sebagai pemimpin pengguna yang memiliki ID '10' di tabel khusus.
John

Jawaban:


13

Penafian penting: cara yang tepat untuk melakukan ini BUKAN untuk mengubah struktur tabel Anda, tetapi untuk menggunakan wp_usermeta. Maka Anda tidak perlu membuat SQL khusus untuk menanyakan posting Anda (meskipun Anda masih membutuhkan SQL khusus untuk mendapatkan daftar semua orang yang melapor ke supervisor tertentu - di bagian Admin, misalnya). Namun, sejak OP bertanya tentang menulis SQL kustom, berikut ini praktik terbaik saat ini untuk menyuntikkan SQL kustom ke dalam Query WordPress yang ada.

Jika Anda melakukan gabungan yang rumit, Anda tidak bisa hanya menggunakan filter posts_where, karena Anda harus memodifikasi gabungan, pilih, dan mungkin grup berdasarkan atau pesan dengan bagian dari permintaan juga.

Taruhan terbaik Anda adalah dengan menggunakan filter 'posts_clauses'. Ini adalah filter yang sangat berguna (yang tidak boleh disalahgunakan!) Yang memungkinkan Anda untuk menambahkan / memodifikasi berbagai bagian dari SQL yang dihasilkan secara otomatis oleh banyak baris kode dalam inti WordPress. Tanda tangan panggilan balik filter adalah: function posts_clauses_filter_cb( $clauses, $query_object ){ }dan mengharapkan Anda untuk kembali $clauses.

Klausul

$clausesadalah array yang berisi kunci-kunci berikut; setiap kunci adalah string SQL yang akan langsung digunakan dalam pernyataan SQL akhir yang dikirim ke database:

  • dimana
  • groupby
  • ikut
  • dipesan oleh
  • berbeda
  • bidang
  • batas

Jika Anda menambahkan tabel ke database (hanya lakukan ini jika Anda benar-benar tidak dapat memanfaatkan post_meta, user_meta atau taksonomi) Anda mungkin perlu menyentuh lebih dari satu klausa ini, misalnya, the fields("SELECT" bagian dari pernyataan SQL), join(semua tabel Anda, selain yang ada di klausa "FROM" Anda), dan mungkin orderby.

Mengubah Klausa

Cara terbaik untuk melakukan ini adalah dengan mensubreferensi kunci yang relevan dari $clausesarray yang Anda dapatkan dari filter:

$join = &$clauses['join'];

Sekarang, jika Anda memodifikasi $join, Anda benar-benar akan langsung memodifikasi $clauses['join']sehingga perubahan akan terjadi $clausesketika Anda mengembalikannya.

Melestarikan Klausa Asli

Kemungkinannya adalah (tidak, serius, dengarkan) Anda ingin mempertahankan SQL yang ada yang dihasilkan WordPress untuk Anda. Jika tidak, Anda mungkin harus melihat posts_requestfilter sebagai gantinya - itu adalah permintaan mySQL lengkap sebelum dikirim ke database, sehingga Anda benar-benar dapat mengatasinya dengan Anda sendiri. Mengapa Anda ingin melakukan ini? Kamu mungkin tidak.

Jadi, untuk melestarikan SQL yang ada di klausa, ingatlah untuk menambahkan klausa, tidak menetapkan untuk mereka (yaitu: gunakan $join .= ' {NEW SQL STUFF}';tidak $join = '{CLOBBER SQL STUFF}';. Perhatikan bahwa karena setiap elemen dari $clausesarray adalah string, jika Anda ingin menambahkannya, Anda mungkin ingin memasukkan spasi sebelum token karakter lain, jika tidak, Anda mungkin akan membuat beberapa kesalahan sintaks SQL.

Anda bisa saja berasumsi akan selalu ada sesuatu di setiap klausa, dan jadi ingatlah untuk memulai setiap string baru dengan spasi, seperti pada:, $join .= ' my_tableatau, Anda selalu dapat menambahkan garis kecil yang hanya menambah ruang jika Anda perlu:

$join = &$clauses['join'];
if (! empty( $join ) ) $join .= ' ';
$join .= "JOIN my_table... "; // <-- note the space at the end
$join .= "JOIN my_other_table... ";


return $clauses;

Itu hal yang gaya lebih dari apa pun. Bit penting untuk diingat adalah: selalu meninggalkan ruang SEBELUM string Anda jika Anda menambahkan klausa yang sudah memiliki beberapa SQL di dalamnya!

Menyatukannya

Aturan pertama pengembangan WordPress adalah mencoba menggunakan sebanyak mungkin fungsionalitas inti. Ini adalah cara terbaik untuk membuktikan pekerjaan Anda di masa depan. Misalkan tim inti memutuskan bahwa WordPress sekarang akan menggunakan SQLite atau Oracle atau bahasa database lainnya. MySQL yang ditulis tangan dapat menjadi tidak valid dan merusak plugin atau tema Anda! Lebih baik membiarkan WP menghasilkan SQL sebanyak mungkin sendiri, dan tambahkan saja bit yang Anda butuhkan.

Jadi urutan pertama bisnis adalah meningkatkan WP_Queryuntuk menghasilkan sebanyak mungkin permintaan dasar Anda. Metode tepat yang kita gunakan untuk melakukan ini sangat tergantung pada di mana daftar posting ini seharusnya muncul. Jika itu adalah sub-bagian halaman (bukan permintaan utama Anda) yang akan Anda gunakan get_posts(); jika itu permintaan utama, saya kira Anda bisa menggunakan query_posts()dan menyelesaikannya, tetapi cara yang tepat untuk melakukannya adalah dengan mencegat permintaan utama sebelum menyentuh database (dan menggunakan siklus server) jadi gunakan requestfilter.

Oke, jadi Anda telah membuat kueri dan SQL akan segera dibuat. Sebenarnya, itu telah dibuat, tidak dikirim ke basis data. Dengan menggunakan posts_clausesfilter, Anda akan menambahkan tabel hubungan karyawan Anda ke dalam campuran. Sebut saja tabel ini {$ wpdb-> awalan}. 'user_relationship', dan ini adalah tabel persimpangan. (Omong-omong, saya sarankan Anda membuat generik struktur tabel ini dan mengubahnya menjadi tabel persimpangan yang tepat dengan bidang-bidang berikut: 'relationship_id', 'user_id', 'related_user_id', 'relationship_type'; ini jauh lebih fleksibel dan kuat. .. tapi saya ngelantur).

Jika saya mengerti apa yang ingin Anda lakukan, Anda ingin memberikan ID Pemimpin dan kemudian hanya melihat posting oleh Pengikut Pemimpin itu. Saya harap saya benar. Jika itu tidak benar, Anda harus menerima apa yang saya katakan dan menyesuaikannya dengan kebutuhan Anda. Saya akan tetap dengan struktur meja Anda: kami memiliki a leader_iddan a follower_id. Jadi GABUNG akan diaktifkan {$wpdb->posts}.post_authorsebagai kunci asing ke 'follower_id' di tabel 'user_relationship' Anda.

add_filter( 'posts_clauses', 'filter_by_leader_id', 10, 2 ); // we need the 2 because we want to get all the arguments

function filter_by_leader_id( $clauses, $query_object ){
  // I don't know how you intend to pass the leader_id, so let's just assume it's a global
  global $leader_id;

  // In this example I only want to affect a query on the home page.
  // This is where the $query_object is used, to help us avoid affecting
  // ALL queries (since ALL queries pass through this filter)
  if ( $query_object->is_home() ){
    // Now, let's add your table into the SQL
    $join = &$clauses['join'];
    if (! empty( $join ) ) $join .= ' '; // add a space only if we have to (for bonus marks!)
    $join .= "JOIN {$wpdb->prefix}employee_relationship EMP_R ON EMP_R.follower_id = {$wpdb->posts}.author_id";

    // And make sure we add it to our selection criteria
    $where = &$clauses['where'];
    // Regardless, you always start with AND, because there's always a '1=1' statement as the first statement of the WHERE clause that's added in by WP/
    // Just don't forget the leading space!
    $where .= " AND EMP_R.leader_id={$leader_id}"; // assuming $leader_id is always (int)

    // And I assume you'll want the posts "grouped" by user id, so let's modify the groupby clause
    $groupby = &$clauses['groupby'];
    // We need to prepend, so...
    if (! empty( $groupby ) ) $groupby = ' ' . $groupby; // For the show-offs
    $groupby = "{$wpdb->posts}.post_author" . $groupby;
  }

  // Regardless, we need to return our clauses...
  return $clauses;
}

13

Saya menjawab pertanyaan ini sangat terlambat dan permintaan maaf saya untuk hal yang sama. Saya sudah terlalu sibuk dengan tenggat waktu untuk mengurus ini.

Terima kasih banyak kepada @ m0r7if3r dan @kaiser dalam memberikan solusi dasar yang dapat saya sampaikan dan terapkan dalam aplikasi saya. Jawaban ini memberikan detail adaptasi saya terhadap solusi yang ditawarkan oleh @ m0r7if3r dan @kaiser.

Pertama, izinkan saya menjelaskan mengapa pertanyaan ini ditanyakan. Dari pertanyaan dan komentarnya, orang dapat menyimpulkan bahwa saya mencoba membuat WP_Query menarik semua pengguna (pemimpin) yang diikuti oleh pengguna tertentu (pengikut). Hubungan antara pengikut dan pemimpin disimpan dalam tabel khusus follow. Solusi paling umum untuk masalah ini adalah dengan menarik ID pengguna dari semua pemimpin pengikut dari tabel follow dan letakkan dalam array. Lihat di bawah:

global $wpdb;
$results = $wpdb->get_results($wpdb->prepare('SELECT leader_id FROM cs_follow WHERE follower_id = %s', $user_id));

foreach($results as $result)
    $leaders[] = $result->leader_id;

Setelah memiliki susunan pemimpin, Anda dapat meneruskannya sebagai argumen ke WP_Query. Lihat di bawah:

if (isset($leaders)) $authors = implode(',', $leaders); // Necessary as authors argument of WP_Query only accepts string containing post author ID's seperated by commas

$args = array(
    'post_type'         => 'post',
    'posts_per_page'    => 10,
    'author'            => $authors
);

$wp_query = new WP_Query( $args );

// Normal WordPress loop continues

Solusi di atas adalah cara paling sederhana untuk mencapai hasil yang saya inginkan. Namun, ini tidak dapat diskalakan. Saat Anda memiliki pengikut yang mengikuti puluhan dan ribuan pemimpin, susunan ID pemimpin yang dihasilkan akan menjadi sangat besar dan memaksa situs WordPress Anda untuk menggunakan memori 100MB - 250MB pada setiap pemuatan halaman dan akhirnya menghancurkan situs. Solusi untuk masalah ini adalah menjalankan query SQL langsung pada database dan mengambil posting yang relevan. Saat itulah solusi @ m0r7if3r datang untuk menyelamatkan. Mengikuti rekomendasi @ kaiser saya berangkat untuk menguji kedua implementasi. Saya mengimpor sekitar 47 ribu pengguna dari file CSV untuk mendaftarkan mereka pada instalasi pengujian WordPress yang baru. Instalasi sedang menjalankan tema Twenty Eleven. Setelah ini saya menjalankan loop for untuk membuat sekitar 50 pengguna mengikuti setiap pengguna lainnya. Perbedaan waktu permintaan untuk solusi @kaiser dan @ m0r7if3r sangat mengejutkan. Solusi @ kaiser biasanya memakan waktu sekitar 2 hingga 5 detik untuk setiap permintaan. Variasi yang saya perkirakan terjadi ketika WordPress menyimpan cache untuk digunakan nanti. Di sisi lain solusi @ m0r7if3r menunjukkan waktu permintaan rata-rata 0,02 ms. Untuk menguji kedua solusi saya telah mengindeks ON untuk kolom leader_id. Tanpa pengindeksan ada peningkatan dramatis dalam waktu kueri.

Penggunaan memori saat menggunakan solusi berbasis array berdiri sekitar 100-150 MB dan turun menjadi 20 MB saat menjalankan SQL langsung.

Saya mengalami masalah dengan solusi @ m0r7if3r ketika saya harus meneruskan ID pengikut ke fungsi filter posts_where. Atleast, sesuai pengetahuan saya, WordPress tidak memungkinkan untuk melewatkan variabel ke fungsi filer. Anda dapat menggunakan variabel Global, tetapi saya ingin menghindari global. Saya akhirnya memperpanjang WP_Query untuk akhirnya mengatasi masalah ini. Jadi, inilah solusi terakhir yang saya terapkan (berdasarkan solusi @ m0r7if3r).

class WP_Query_Posts_by_Leader extends WP_Query {
    var $follower_id;

    function __construct($args=array()) {
        if(!empty($args['follower_id'])) {
            $this->follower_id = $args['follower_id'];
            add_filter('posts_where', array($this, 'posts_where'));
        }

        parent::query($args);
    }

    function posts_where($where) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'follow';
        $where .= $wpdb->prepare(" AND post_author IN (SELECT leader_id FROM " . $table_name . " WHERE follower_id = %d )", $this->follower_id);
        return $where;
    }
}


$args = array(
    'post_type'         => 'post',
    'posts_per_page'    => 10,
    'follower_id'       => $follower_id
);

$wp_query = new WP_Query_Posts_by_Leader( $args );

Catatan: Saya akhirnya mencoba solusi di atas dengan 1,2 juta entri di tabel ikuti. Waktu permintaan rata-rata sekitar 0,060 ms.


3
Saya tidak pernah memberi tahu Anda betapa saya menghargai diskusi tentang pertanyaan ini. Sekarang saya tahu bahwa saya melewatkannya, saya telah menambahkan upvote :)
kaiser

8

Anda dapat melakukan ini dengan solusi SQL sepenuhnya menggunakan posts_wherefilter. Berikut ini contohnya:

if( some condition ) 
    add_filter( 'posts_where', 'wpse50305_leader_where' );
    // lol, question id is the same forward and backward

function wpse50305_leader_where( $where ) {
    $where .= $GLOBALS['wpdb']->prepare( ' AND post_author '.
        'IN ( '.
            'SELECT leader_id '.
            'FROM custom_table_name '.
            'WHERE follower_id = %s'.
        ' ) ', $follower_id );
    return $where;
}

Saya pikir mungkin ada cara untuk melakukan ini JOINjuga, tetapi saya tidak bisa memunculkannya. Saya akan terus bermain dengannya dan memperbarui jawabannya jika saya mendapatkannya.

Bergantian, seperti yang disarankan @iser , Anda dapat membaginya menjadi dua bagian: mendapatkan pemimpin dan melakukan kueri. Saya merasa ini mungkin kurang efisien, tetapi tentu saja cara yang lebih mudah dimengerti. Anda harus menguji efisiensi sendiri untuk menentukan metode mana yang lebih baik, karena kueri SQL bersarang bisa menjadi sangat lambat.

DARI KOMENTAR:

Anda harus meletakkan fungsi di Anda functions.phpdan melakukan yang add_filter()benar sebelum query()metode WP_Querydipanggil. Segera setelah itu, Anda harus remove_filter()sehingga tidak mempengaruhi kueri lainnya.


1
Mengedit A Anda dan menambahkan prepare(). Semoga Anda tidak keberatan hasil edit. Dan ya: Kinerja memiliki untuk diukur dengan OP. Bagaimanapun: Saya masih berpikir ini seharusnya hanya usermeta dan bukan yang lain.
kaiser

@ m0r7if3r Thx untuk mencoba solusi. Saya baru saja mengirim komentar sebagai jawaban atas jawaban kaiser, dengan kekhawatiran tentang kemungkinan masalah skalabilitas. Harap mempertimbangkannya.
John

1
@kaiser Tidak keberatan sedikit pun, sebenarnya saya agak menghargainya :)
mor7ifer

@ m0r7if3r Terima kasih. Memiliki orang-orang seperti Anda di komunitas batu :)
kaiser

1
Anda harus meletakkan fungsi di Anda functions.phpdan melakukan yang add_filter()benar sebelum query()metode WP_Querydipanggil. Segera setelah itu, Anda harus remove_filter()sehingga tidak mempengaruhi kueri lainnya. Saya tidak yakin apa masalah penulisan ulang URL, saya telah menggunakan posts_wherebanyak kesempatan dan tidak pernah melihat itu ...
mor7ifer

6

Tag Template

Cukup tempatkan kedua fungsi di functions.phpfile Anda . Kemudian sesuaikan fungsi 1 dan tambahkan nama tabel khusus Anda. Maka Anda perlu beberapa percobaan / kesalahan untuk menyingkirkan ID pengguna saat ini di dalam array yang dihasilkan (lihat komentar).

/**
 * Get "Leaders" of the current user
 * @param int $user_id The current users ID
 * @return array $query The leaders
 */
function wpse50305_get_leaders( $user_id )
{
    global $wpdb;

    return $wpdb->query( $wpdb->prepare(
        "
            SELECT `leader_id`, `follower_id`
            FROM %s
                WHERE `follower_id` = %s
            ORDERBY `leader_id` ASC
        ",
        // Edit the table name
        "{$wpdb->prefix}custom_table_name"
        $user_id
    ) );
}

/**
 * Get posts array that contain posts by 
 * "Leaders" the current user is following
 * @return array $posts Posts that are by the current "Leader
 */
function wpse50305_list_posts_by_leader()
{
    get_currentuserinfo();
    global $current_user;

    $user_id = $current_user->ID;

    $leaders = wpse5035_get_leaders( $user_id );
    // could be that you need to loop over the $leaders
    // and get rid of the follower ids

    return get_posts( array(
        'author' => implode( ",", $leaders )
    ) );
}

Di dalam templat

Di sini Anda dapat melakukan apa pun yang Anda inginkan dengan hasil Anda.

foreach ( wpse50305_list_posts_by_leader() as $post )
{
    // do something with $post
}

CATATAN Kami tidak memiliki testdata, dll. Jadi di atas adalah sedikit permainan menebak. Pastikan Anda mengedit jawaban ini dengan apa yang sesuai untuk Anda, jadi kami memiliki hasil yang memuaskan untuk pembaca nanti. Saya akan menyetujui hasil edit jika Anda mendapat perwakilan yang terlalu rendah. Anda kemudian juga dapat menghapus catatan ini. Terima kasih.


2
JOINadalah jauh lebih mahal. Plus: Seperti yang saya sebutkan, kami tidak memiliki data uji, jadi silakan uji kedua jawaban dan beri kami pencerahan dengan hasil Anda.
kaiser

1
WP_Query sendiri berfungsi dengan BERGABUNG antara tabel posting dan postmeta saat melakukan kueri. Saya telah melihat peningkatan penggunaan memori PHP hingga 70MB - 200MB per beban halaman. Menjalankan sesuatu seperti itu dengan banyak pengguna secara bersamaan akan membutuhkan infrastruktur yang ekstrem. Dugaan saya adalah bahwa, karena WordPress sudah menerapkan teknik serupa, GABUNG harus lebih sedikit pajak dibandingkan dengan bekerja dengan berbagai ID.
John

1
@ John senang mendengar. benar-benar ingin tahu hasilnya.
kaiser

4
Ok di sini adalah hasil tes. Untuk ini saya menambahkan sekitar 47K pengguna dari file csv. Kemudian, jalankan loop untuk membuat 45 pengguna pertama mengikuti setiap pengguna lainnya. Ini menghasilkan 3.704.951 catatan yang disimpan di tabel khusus saya. Awalnya, solusi @ m0r7if3r memberi saya waktu kueri 95 detik, yang turun menjadi 0,020 ms setelah mengaktifkan indeks ON pada kolom leader_id. Total memori PHP yang dikonsumsi adalah sekitar 20MB. Di sisi lain, solusi Anda membutuhkan sekitar 2 hingga 5 detik untuk kueri dengan pengindeksan AKTIF. Total memori PHP yang dikonsumsi adalah sekitar 117MB.
John

1
Saya menambahkan jawaban lain (kita dapat memproses & memodifikasi / mengeditnya) karena pemformatan kode dalam komentar cukup menyebalkan: P
kaiser

3

Catatan: Jawaban di sini adalah untuk menghindari diskusi yang panjang dalam komentar

  1. Inilah Kode OP dari komentar, untuk menambahkan set pertama pengguna uji. Saya harus dimodifikasi menjadi contoh dunia nyata.

    for ( $j = 2; $j <= 52; $j++ ) 
    {
        for ( $i = ($j + 1); $i <= 47000; $i++ )
        {
            $rows_affected = $wpdb->insert( $table_name, array( 'leader_id' => $i, 'follower_id' => $j ) );
        }
    }

    OP Tentang Tes Untuk ini saya menambahkan sekitar 47K pengguna dari file csv. Kemudian, jalankan loop untuk membuat 45 pengguna pertama mengikuti setiap pengguna lainnya.

    • Ini menghasilkan 3.704.951 catatan yang disimpan di tabel khusus saya.
    • Awalnya, solusi @ m0r7if3r memberi saya waktu kueri 95 detik, yang turun menjadi 0,020 ms setelah mengaktifkan indeks ON pada kolom leader_id. Total memori PHP yang dikonsumsi adalah sekitar 20MB.
    • Di sisi lain, solusi Anda membutuhkan sekitar 2 hingga 5 detik untuk kueri dengan pengindeksan AKTIF. Total memori PHP yang dikonsumsi adalah sekitar 117MB.
  2. Jawaban saya untuk tes ↑ ini:

    tes yang lebih "kehidupan nyata": Biarkan setiap pengguna mengikuti a $leader_amount = rand( 0, 5 );dan kemudian tambahkan jumlah $leader_amount x $random_ids = rand( 0, 47000 );untuk setiap pengguna. Sejauh ini yang kita tahu adalah: Solusi saya akan sangat buruk jika pengguna mengikuti satu sama lain. Selanjutnya: Anda akan menunjukkan bagaimana Anda melakukan tes dan di mana tepatnya Anda menambahkan penghitung waktu.

    Saya juga harus menyatakan bahwa ↑ pelacakan waktu di atas tidak dapat benar-benar diukur, karena juga akan memerlukan waktu untuk menghitung loop bersama. Lebih baik untuk mengulang melalui set ID yang dihasilkan dalam loop kedua.

proses selanjutnya di sini


2
Catatan untuk mereka yang telah mengikuti T ini: Saya sedang dalam proses mengukur kinerja dalam berbagai kondisi dan akan memposting hasilnya dalam satu hari atau 3. Ini adalah tugas yang sangat memakan waktu karena skala data uji yang perlu dihasilkan.
John
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.