๋๋ ์ง๊ธ์ด ๋ฌธ์ ์ ๋ฉฐ์น ์ด ์ง๋ฌ์ต๋๋ค. ์ฒ์์๋ ์ฌ์ฉ์ ํ๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด์์ต๋๋ค. ์ฌ๊ธฐ์ WordPress Answers์์ ๋ช ๊ฐ์ง ๋ฉ์ง ๊ถ์ฅ ์ฌํญ์ด ์์ต๋๋ค. ๊ถ์ฅ ์ฌํญ์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ ์ ํ ์ด๋ธ์ ์ถ๊ฐํ์ต๋๋ค.
id leader_id follower_id
1 2 4
2 3 10
3 2 10
์์ ํ์์ ์ฒซ ๋ฒ์งธ ํ์๋ ID๊ฐ 2 ์ธ ์ฌ์ฉ์๊ฐ ์๊ณ ๊ทธ ๋ค์ ID๊ฐ 4 ์ธ ์ฌ์ฉ์๊ฐ ์์ต๋๋ค. ๋ ๋ฒ์งธ ํ์์ ID๊ฐ 3 ์ธ ์ฌ์ฉ์ ๋ค์ ID๊ฐ์๋ ์ฌ์ฉ์๊ฐ ์์ต๋๋ค ์ธ ๋ฒ์งธ ํ์๋ ๋์ผํ ๋ ผ๋ฆฌ๊ฐ ์ ์ฉ๋ฉ๋๋ค.
์ด์ ๋ณธ์ง์ ์ผ๋ก WP_Query๋ฅผ ํ์ฅํ์ฌ ์ฌ์ฉ์์ ๋ฆฌ๋ ๋ง ๊ฐ์ ธ์จ ๊ฒ์๋ฌผ์ ์ ํ ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ํ๋ฅผ ๊ณ ๋ คํ์ฌ ์ฌ์ฉ์ ID 10์ WP_Query์ ์ ๋ฌํ๋ฉด ๊ฒฐ๊ณผ์๋ ์ฌ์ฉ์ ID 2 ๋ฐ ์ฌ์ฉ์ ID 3์ ๊ฒ์๋ฌผ ๋ง ํฌํจ๋์ด์ผํฉ๋๋ค.
๋ต๋ณ์ ์ฐพ์ผ๋ ค๊ณ ๋ง์ด ๊ฒ์ํ์ต๋๋ค. ๋ํ WP_Query ํด๋์ค๋ฅผ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๋ฐ ๋์์ด๋๋ ์์ต์๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. ๋น์ทํ ์ง๋ฌธ์ ๋ํ Mike Schinkel์ ๋ต๋ณ (ํ์ฅ WP_Query)์ ๋ณด์์ง๋ง ๋ด ์๊ตฌ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค์ ๋ก ์ดํดํ์ง ๋ชปํ์ต๋๋ค. ๋๊ตฐ๊ฐ ๋๋ฅผ ๋์ ์ค ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์์ฒญ์ ๋ฐ๋ผ Mike์ ๋ต๋ณ์ ๋ํ ๋งํฌ :
๋งํฌ 1 , ๋งํฌ 2
๋ต๋ณ
์ค์ ๊ณ ์ง ์ฌํญ :์ด๋ฅผ ์ํํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ํ ์ด๋ธ ๊ตฌ์กฐ๋ฅผ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ wp_usermeta๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฒ์๋ฌผ์ ์ฟผ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ง์ SQL์ ๋ง๋ค ํ์๋ ์์ต๋๋ค (๋จ, ๊ด๋ฆฌ์ ์น์ ์์ ํน์ ๊ด๋ฆฌ์์๊ฒ๋ณด๊ณ ํ๋ ๋ชจ๋ ์ฌ๋์ ๋ชฉ๋ก์ ๊ฐ์ ธ ์ค๋ ค๋ฉด ์ผ๋ถ ์ฌ์ฉ์ ์ง์ SQL์ด ํ์ํฉ๋๋ค). ๊ทธ๋ฌ๋ OP๊ฐ ์ฌ์ฉ์ ์ง์ SQL ์์ฑ์ ๋ํด ์์ฒญ ํ์ผ๋ฏ๋ก ๋ค์์ ๊ธฐ์กด WordPress ์ฟผ๋ฆฌ์ ์ฌ์ฉ์ ์ง์ SQL์ ์ฝ์ ํ๋ ํ์ฌ ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค.
๋ณต์กํ ์กฐ์ธ์ ์ํํ๋ ๊ฒฝ์ฐ์๋ join_where ํํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฟผ๋ฆฌ์ ์กฐ์ธ, ์ ํ ๋ฐ ๊ทธ๋ฃน ๋ณ ๋๋ ์์๋ณ๋ก ์น์ ์ ์์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ โposts_clausesโํํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ ์ฉํ ํํฐ์
๋๋ค (๋จ์ฉํด์๋ ์๋ฉ๋๋ค!). WordPress ์ฝ์ด ๋ด์ ๋ง์ ์ฝ๋ ์ค์ ์ํด ์๋์ผ๋ก ์์ฑ๋๋ SQL์ ๋ค์ํ ๋ถ๋ถ์ ์ถ๊ฐ / ์์ ํ ์ ์์ต๋๋ค. ํํฐ ์ฝ๋ฐฑ ์๋ช
์ ๋ค์ function posts_clauses_filter_cb( $clauses, $query_object ){ }
๊ณผ ๊ฐ์ต๋๋ค
$clauses
.
์กฐํญ
$clauses
๋ค์ ํค๋ฅผ ํฌํจํ๋ ๋ฐฐ์ด์
๋๋ค. ๊ฐ ํค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ก ๋ ์ต์ข
SQL ๋ฌธ์์ ์ง์ ์ฌ์ฉ๋๋ SQL ๋ฌธ์์ด์
๋๋ค.
- ์ด๋์
- ๊ทธ๋ฃน ๋ณ
- ๋ถ๋ค
- ์ฃผ๋ฌธ
- ๋๋ ทํ
- ์ ์ง
- ์ ํ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ (post_meta, user_meta ๋๋ taxonomies๋ฅผ ์ ๋ ํ์ฉํ ์์๋ ๊ฒฝ์ฐ์๋ง ์ํ)์ด ์ ์ค ํ๋ ์ด์์ ํฐ์นํด์ผ ํ ์๋ ์์ต๋๋ค fields
( ์ : โSELECTโ SQL ๋ฌธ์ ์ผ๋ถ), join
( โFROMโ์ ์์๋ ํ
์ด๋ธ ์ด์ธ์ ๋ชจ๋ ํ
์ด๋ธ)orderby
.
์กฐํญ ์์
์ด๋ฅผ ์ํํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ $clauses
์ ํํฐ์์ ์ป์ ๋ฐฐ์ด ์์ ๊ด๋ จ ํค๋ฅผ ํ์ ์ฐธ์กฐํ๋ ๊ฒ์
๋๋ค .
$join = &$clauses['join'];
์ด์ ๋ฅผ ์์ $join
ํ๋ฉด ์ค์ ๋ก ์ง์ ์์ $clauses['join']
๋๋ฏ๋ก ๋ณ๊ฒฝ ์ฌํญ์ด$clauses
์ ๋ฐํ ํ ๋ .
์๋ณธ ์ ๋ณด์กด
WordPress์์ ์์ฑ ํ ๊ธฐ์กด SQL์ ์ ์งํ๋ ค๊ณ ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค (์ฌ์ง์ด ๋ค๋ฆฌ์ง ์์ต๋๋ค). ๊ทธ๋ ์ง ์๋ค๋ฉด ์๋ง๋posts_request
ํํฐ๋ฅผ ์ฆ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์ก๋๊ธฐ ์ง์ ์ ์์ ํ mySQL ์ฟผ๋ฆฌ์ด๋ฏ๋ก ์์ ์ ํํฐ๋ก ์์ ํ ํด๋ก๋ฒ ํ ์ ์์ต๋๋ค. ์ ์ด๋ ๊ฒ ํ์๊ฒ ์ต๋๊น? ๋น์ ์ ์๋งํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์ ์์ ๊ธฐ์กด SQL์ ์ ์งํ๋ ค๋ฉด ์ ์ ์ถ๊ฐํ์ง ๋ง๊ณ ์ ์ ํ ๋นํ์ง ๋ง์ญ์์ค (์ : $join .= ' {NEW SQL STUFF}';
not ์ฌ์ฉ) $join = '{CLOBBER SQL STUFF}';
. $clauses
๋ฐฐ์ด ์ ๊ฐ ์์ ๋ ๋ฌธ์์ด์ด๋ฏ๋ก ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ ๋ฌธ์ ํ ํฐ ์์ ๊ณต๋ฐฑ์ ์ฝ์
ํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด SQL ๊ตฌ๋ฌธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ฐ ์ ์ ํญ์ ๋ฌด์ธ๊ฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ์ ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ณต๋ฐฑ์ผ๋ก ์ ๋ฌธ์์ด์ ๊ฐ๊ฐ ์์ $join .= ' my_table
ํด์ผํฉ๋๋ค. ๋๋ ํ์ํ ๊ฒฝ์ฐ ๊ณต๋ฐฑ์ ์ถ๊ฐํ๋ ์์ ์ค์ ํญ์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
$join = &$clauses['join'];
if (! empty( $join ) ) $join .= ' ';
$join .= "JOIN my_table... "; // <-- note the space at the end
$join .= "JOIN my_other_table... ";
return $clauses;
๊ทธ๊ฒ์ ๋ค๋ฅธ ์ด๋ค ๊ฒ๋ณด๋ค ๋ฌธ์ฒด์ ์ธ ๊ฒ์ ๋๋ค. ๊ธฐ์ตํด์ผ ํ ์ค์ํ ์ ์ ์ด๋ฏธ ์ผ๋ถ SQL์ด ํฌํจ ๋ ์ ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ ๋ฌธ์์ด ์์ ๊ณต๋ฐฑ์ ๋จ๊ฒจ ๋๋ ๊ฒ์ ๋๋ค.
ํจ๊ป ๋ชจ์ผ๊ธฐ
WordPress ๊ฐ๋ฐ์ ์ฒซ ๋ฒ์งธ ๊ท์น์ ์ต๋ํ ๋ง์ ํต์ฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.์ด๊ฒ์ด ํฅํ ์์ ์ ์ฆ๋ช ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ํต์ฌ ํ์ด WordPress๊ฐ ์ด์ SQLite ๋๋ Oracle ๋๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์ด๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ๊ฒฐ์ ํ๋ค๊ณ ๊ฐ์ ํ์ญ์์ค. ์ง์ ์์ฑํ mySQL์ด ์ ํจํ์ง ์๊ฒ๋์ด ํ๋ฌ๊ทธ์ธ์ด๋ ํ ๋ง๊ฐ ๊นจ์ง ์ ์์ต๋๋ค! WP๊ฐ ๊ฐ๋ฅํ ๋ง์ SQL์ ์์ฒด์ ์ผ๋ก ์์ฑํ๊ณ ํ์ํ ๋นํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฐ๋ผ์ ๋น์ฆ๋์ค ์ฐ์ ์์๋ ์ต๋ํ WP_Query
๋ง์ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ฅผ ์์ฑ ํ๋ ๋ฐ ํ์ฉ ๋ฉ๋๋ค. ์ด ์์
์ ์ํํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ ํํ ๋ฐฉ๋ฒ์์ด ๊ฒ์๋ฌผ ๋ชฉ๋ก์ด ํ์ ๋๋ ์์น์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค . ํ์ด์ง์ ํ์ ์น์
์ธ ๊ฒฝ์ฐ (๊ธฐ๋ณธ ์ฟผ๋ฆฌ๊ฐ ์๋) get_posts()
; ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ์ธ ๊ฒฝ์ฐ ์ฌ์ฉ query_posts()
ํ๊ณ ์๋ฃ ํ ์ ์๋ค๊ณ ์๊ฐ ํ์ง๋ง ์ ์ ํ ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ฌํ๊ธฐ ์ ์ ์ฐจ๋จํ๊ณ ์๋ฒ์ฃผ๊ธฐ๋ฅผ ์๋นํ๋ฏ๋ก request
ํํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์
๋๋ค.
์ด์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ผ๋ฉฐ SQL์ ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค. ์ฌ์ค, ๊ทธ๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ณด๋ด์ง์ง ์๊ณ ๋ง๋ค์ด์ก์ต๋๋ค. posts_clauses
ํํฐ ๋ฅผ ์ฌ์ฉํ๋ฉด ์ง์ ๊ด๊ณ ํ
์ด๋ธ์ ๋ฏน์ค์ ์ถ๊ฐํ๊ฒ๋ฉ๋๋ค. ์ด ํ
์ด๋ธ์ {$ wpdb-> prefix}๋ผ๊ณ ํ์. โuser_relationshipโ์ด๋ฉฐ ๊ต์ฐจ ํ
์ด๋ธ์
๋๋ค. (์ด๋ฐ ์์ผ๋ก์ด ํ
์ด๋ธ ๊ตฌ์กฐ๋ฅผ ์ผ๋ฐํํ๊ณ โrelationship_idโ, โuser_idโ, โrelated_user_idโ, โrelationship_typeโํ๋๊ฐ์๋ ์ ์ ํ ๊ต์ฐจ ํ
์ด๋ธ๋ก ๋ฐ๊พธ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํจ์ฌ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํฉ๋๋ค. .. ๊ทธ๋ฌ๋ ๋๋ ์ฐ๋งํ๋ค.)
๋ด๊ฐ ์ํ๋ ๊ฒ์ ์ดํดํ๋ฉด ๋ฆฌ๋์ ID๋ฅผ ์ ๋ฌํ ๋ค์ ํด๋น ๋ฆฌ๋์ ํ๋ก์๊ฐ ๊ฒ์ ํ ๊ฒ์๋ฌผ ๋ง ๋ณด๋ ค๊ณ ํฉ๋๋ค. ๋๋ ๊ทธ ๊ถ๋ฆฌ๋ฅผ ์ป์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๊ฒ์ด ์ณ์ง ์๋ค๋ฉด, ๋ด๊ฐ ๋งํ ๊ฒ์ ์ทจํ์ฌ ๊ทธ๊ฒ์ ๋น์ ์ ํ์์ ๋ง๊ฒ ์กฐ์ ํด์ผํฉ๋๋ค. ํ
์ด๋ธ ๊ตฌ์กฐ๋ฅผ ๊ณ ์ํ๊ฒ ์ต๋๋ค . a leader_id
์ a๊ฐ follower_id
์์ต๋๋ค. ๋ฐ๋ผ์ JOIN์ {$wpdb->posts}.post_author
โuser_relationshipโํ
์ด๋ธ์ โfollower_idโ์ ๋ํ ์ธ๋ ํค๋ก ์ฌ์ฉ๋ฉ๋๋ค.
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;
}
๋ต๋ณ
๋๋์ด ์ง๋ฌธ์ ๋งค์ฐ ๋ฆ๊ฒ ๋ต๋ณํ๊ณ ์์ผ๋ฉฐ ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๋ง๊ฐ์ผ์ด ๋๋ฌด ๋ฐ๋น ์ ์ฐธ์ํ์ง ๋ชปํ์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ฅํ๊ณ ๊ตฌํํ ์์๋ ๊ธฐ๋ณธ ์๋ฃจ์ ์ ์ ๊ณต ํ @ m0r7if3r ๋ฐ @kaiser์๊ฒ ํฐ ๊ฐ์ฌ๋ฅผ๋๋ฆฝ๋๋ค. ์ด ๋ต๋ณ์ @ m0r7if3r ๋ฐ @kaiser๊ฐ ์ ๊ณตํ๋ ์๋ฃจ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ ๊ณตํฉ๋๋ค.
๋จผ์ , ์์ด ์ง๋ฌธ์ด ์ฒ์์ ์๋์ง ์ค๋ช
ํ๊ฒ ์ต๋๋ค. ์ง๋ฌธ๊ณผ ๊ทธ ์๊ฒฌ์์ WP_Query๊ฐ ์ฃผ์ด์ง ์ฌ์ฉ์ (ํ๋ก์ด)๊ฐ ๋ฐ๋ฅด๋ ๋ชจ๋ ์ฌ์ฉ์ (์ง๋์)๊ฐ ๊ฒ์๋ฌผ์ ๊ฐ์ ธ ์ค๋๋ก ๋
ธ๋ ฅํ๊ณ ์์์ ์ ์ ์์ต๋๋ค. ์ถ์ข
์์ ๋ฆฌ๋ ๊ฐ์ ๊ด๊ณ๋ ์ฌ์ฉ์ ์ ์ ํ
์ด๋ธ์ ์ ์ฅ๋ฉ๋๋ค follow
. ์ด ๋ฌธ์ ์ ๋ํ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํด๊ฒฐ์ฑ
์ ํ๋ก์ด์ ๋ชจ๋ ๋ฆฌ๋์ ์ฌ์ฉ์ ID๋ฅผ ํ๋ก์ฐ ํ
์ด๋ธ์์ ๊ฐ์ ธ ์์ ๋ฐฐ์ด์ ๋ฐฐ์นํ๋ ๊ฒ์
๋๋ค. ์๋๋ฅผ๋ณด์ญ์์ค :
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;
๋ฆฌ๋ ๋ฐฐ์ด์ด ์์ผ๋ฉด WP_Query์ ์ธ์๋ก ์ ๋ฌํ ์ ์์ต๋๋ค. ์๋๋ฅผ๋ณด์ญ์์ค :
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
์์ ์๋ฃจ์ ์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฅ ํ ์ ์์ต๋๋ค. ์์ญ, ์์ฒ ๋ช ์ ๋ฆฌ๋๋ฅผ ๋ฐ๋ฅด๋ ํ๋ก์๊ฐ ์๊ธฐ๋ฉด ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฆฌ๋ ID ๋ฐฐ์ด์ด ๋งค์ฐ ์ปค์ ธ WordPress ์ฌ์ดํธ์์ ๊ฐ ํ์ด์ง๋ก๋์ 100MB-250MB์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ดํธ๊ฐ ์ถฉ๋ํ๊ฒ๋ฉ๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ง์ SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ด๋ จ ๊ฒ์๋ฌผ์ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ @ m0r7if3r์ ์๋ฃจ์ ์ด ๊ตฌํด์ก์ต๋๋ค. @kaiser์ ๊ถ์ฅ ์ฌํญ์ ๋ฐ๋ผ ๋ ๊ตฌํ์ ๋ชจ๋ ํ ์คํธํ์ต๋๋ค. WordPress์ ์๋ก์ด ํ ์คํธ ์ค์น์ ๋ฑ๋กํ๊ธฐ ์ํด CSV ํ์ผ์์ ์ฝ 47K ๋ช ์ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ธ ์์ต๋๋ค. ์ค์น ์ค์ Twenty Eleven ํ ๋ง๊ฐ ์คํ๋์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฝ 50 ๋ช ์ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ๋ฐ๋ฅด๋๋ก for ๋ฃจํ๋ฅผ ์คํํ์ต๋๋ค. @kaiser์ @ m0r7if3r์ ์๋ฃจ์ ์ ๋ํ ์ฟผ๋ฆฌ ์๊ฐ์ ์ฐจ์ด๋ ์์ฒญ๋ฌ์ต๋๋ค. @kaiser์ ์๋ฃจ์ ์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ ์ฟผ๋ฆฌ๋ง๋ค ์ฝ 2 ~ 5 ์ด๊ฐ ๊ฑธ๋ ธ์ต๋๋ค. ๋ด๊ฐ ์๊ฐํ๋ ๋ณํ์ WordPress๊ฐ ๋์ค์ ์ฌ์ฉํ๊ธฐ ์ํด ์ฟผ๋ฆฌ๋ฅผ ์บ์ ํ ๋ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ฉด @ m0r7if3r์ ์๋ฃจ์ ์ ํ๊ท 0.02ms์ ์ฟผ๋ฆฌ ์๊ฐ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ๋ ์๋ฃจ์ ์ ํ ์คํธํ๊ธฐ ์ํด leader_id ์ด์ ๋ํด ์์ธ์ ์์ฑํ์ต๋๋ค. ์ธ๋ฑ์ฑ์ด ์์ผ๋ฉด ์ฟผ๋ฆฌ ์๊ฐ์ด ํฌ๊ฒ ์ฆ๊ฐํ์ต๋๋ค.
์ด๋ ์ด ๊ธฐ๋ฐ ์๋ฃจ์ ์ ์ฌ์ฉํ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฝ 100-150MB์ด๋ฉฐ ์ง์ SQL์ ์คํํ ๋ 20MB๋ก ๋จ์ด์ก์ต๋๋ค.
์ถ์ข ์ ID๋ฅผ posts_where ํํฐ ํจ์์ ์ ๋ฌํด์ผ ํ ๋ @ m0r7if3r์ ์๋ฃจ์ ์ผ๋ก ์ถฉ๋ํ์ต๋๋ค. ๋ด๊ฐ ์๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด WordPress์์๋ ๋ณ์๋ฅผ ํ์ผ๋ฌ ํจ์์ ์ ๋ฌํ ์ ์์ต๋๋ค. ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง ์ ์ญ ๋ณ์๋ฅผ ํผํ๊ณ ์ถ์์ต๋๋ค. ๊ฒฐ๊ตญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด WP_Query๋ฅผ ํ์ฅํ์ต๋๋ค. ๊ทธ๋์ ๋ด๊ฐ ๊ตฌํ ํ ์ต์ข ์๋ฃจ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค (@ 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 );
์ฐธ๊ณ : ๊ฒฐ๊ตญ ๋ค์ ํ์ 120 ๋ง ํญ๋ชฉ์ผ๋ก ์์ ์๋ฃจ์ ์ ์๋ํ์ต๋๋ค. ํ๊ท ์ฟผ๋ฆฌ ์๊ฐ์ ์ฝ 0.060ms์์ต๋๋ค.
๋ต๋ณ
posts_where
ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ SQL ์๋ฃจ์
์ผ๋ก์ด๋ฅผ ์ํ ํ ์ ์์ต๋๋ค . ๊ทธ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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;
}
๋๋ ์ด๊ฒ์ ํ ์์๋ ๋ฐฉ๋ฒ์ด์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐ JOIN
ํ์ง๋ง, ๋๋ ๊ทธ๊ฒ์ ์๊ฐํด ๋ผ ์ ์๋ค. ๋๋ ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ๋๊ณ ๊ณ์ ๋๋ต์ ์
๋ฐ์ดํธ ํ ๊ฒ์
๋๋ค.
๋๋ @kaiser๊ฐ ์ ์ํ ๊ฒ์ฒ๋ผ ๋ฆฌ๋๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ฟผ๋ฆฌํ๋ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ ํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ํ์คํ ์ดํดํ๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค. ์ค์ฒฉ ๋ SQL ์ฟผ๋ฆฌ๊ฐ ์๋นํ ๋๋ ค์ง ์ ์์ผ๋ฏ๋ก ์ด๋ค ๋ฐฉ๋ฒ์ด ๋ ๋์์ง ๊ฒฐ์ ํ๊ธฐ ์ํด ํจ์จ์ฑ์ ์ง์ ํ ์คํธํด์ผํฉ๋๋ค.
์ฃผ์์์ :
ํจ์๋ฅผ ๋ฃ๊ณ ๋ฉ์๋ ๊ฐ ํธ์ถ ๋๊ธฐ ์ง์ ์ functions.php
์ํํด์ผํฉ๋๋ค . ๋ฐ๋ก ๋ค์ ์ ๋ค๋ฅธ ์ฟผ๋ฆฌ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํด์ผ ํฉ๋๋ค.add_filter()
query()
WP_Query
remove_filter()
๋ต๋ณ
ํ ํ๋ฆฟ ํ๊ทธ
๋ ๊ธฐ๋ฅ์ functions.php
ํ์ผ ์ ๋ฃ์ผ์ญ์์ค . ๊ทธ๋ฐ ๋ค์ ์ฒซ ๋ฒ์งธ ๊ธฐ๋ฅ์ ์กฐ์ ํ๊ณ ์ฌ์ฉ์ ์ ์ ํ
์ด๋ธ ์ด๋ฆ์ ์ถ๊ฐํ์ญ์์ค. ๊ทธ๋ฐ ๋ค์ ๊ฒฐ๊ณผ ๋ฐฐ์ด ๋ด์์ ํ์ฌ ์ฌ์ฉ์ ID๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ์๋ / ์ค๋ฅ๊ฐ ํ์ํฉ๋๋ค (์ฃผ์ ์ฐธ์กฐ).
/**
* 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 )
) );
}
ํ ํ๋ฆฟ ๋ด๋ถ
์ฌ๊ธฐ์์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
foreach ( wpse50305_list_posts_by_leader() as $post )
{
// do something with $post
}
์ฐธ๊ณ ์ฐ๋ฆฌ๋ ๋ณธ๊ฑด (๊ฐ) ์์ ์ถ์ธก ๊ฒ์์ ์กฐ๊ธ ๊ทธ๋์ ๋ฑ testdata๋ก ์์ต๋๋ค. ์๋์ง ํ์ธํ์ญ์์ค ๋น์ ์ ์ฐ๋ฆฌ๊ฐ ๋์ค์ ๋ ์๋ค์๊ฒ ๋ง์กฑ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ , ๊ทธ๋์ ๋น์ ์ ์ํด ์ผํ ๊ฒ์์ด ๋๋ต์ ํธ์ง ํ ์ ์์ต๋๋ค. ๋ด๋น์๊ฐ ๋๋ฌด ์ ์ ๊ฒฝ์ฐ ์์ ์ฌํญ์ ์น์ธํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์์ด ๋ฉ๋ชจ๋ฅผ ์ญ์ ํ ์๋ ์์ต๋๋ค. ๊ฐ์ฌ.
๋ต๋ณ
์ฐธ๊ณ :์ด ๋ต๋ณ์ ์ฃผ์์์ ๊ธด ํ ๋ก ์ ํผํ๊ธฐ์ํ ๊ฒ์ ๋๋ค.
-
์ฃผ์์ OP ์ฝ๋๋ ์ฒซ ๋ฒ์งธ ํ ์คํธ ์ฌ์ฉ์ ์ธํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ค์ ์ฌ๋ก๋ก ์์ ํด์ผํฉ๋๋ค.
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 ์ด๋ฅผ ์ํด csv ํ์ผ์์ ์ฝ 47K ๋ช ์ ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ๋์ค์ ์ฒ์ 45 ๋ช ์ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ๋ฐ๋ฅด๋๋ก for ๋ฃจํ๋ฅผ ์คํํ์ต๋๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก 3,704,951 ๊ฐ์ ๋ ์ฝ๋๊ฐ ์ฌ์ฉ์ ์ ์ ํ ์ด๋ธ์ ์ ์ฅ๋์์ต๋๋ค.
- ์ฒ์์ @ m0r7if3r์ ์๋ฃจ์ ์ 95 ์ด์ ์ฟผ๋ฆฌ ์๊ฐ์ ์ ๊ณตํ์ฌ leader_id ์ด์์ ์ธ๋ฑ์ฑ์ ์ผ ํ 0.020ms๋ก ์ค์์ต๋๋ค. ์๋น ๋ ์ด PHP ๋ฉ๋ชจ๋ฆฌ๋ ์ฝ 20MB์ ๋๋ค.
- ๋ฐ๋ฉด, ์ธ๋ฑ์ฑ์ด ์ค์ ๋ ์ฟผ๋ฆฌ์์ ์๋ฃจ์ ์ ์ฝ 2 ~ 5 ์ด๊ฐ ๊ฑธ๋ ธ์ต๋๋ค. ์๋น ๋ ์ด PHP ๋ฉ๋ชจ๋ฆฌ๋ ์ฝ 117MB์ ๋๋ค.
-
์ด ํ ์คํธ์ ๋ํ ๋์ ๋๋ต :
๋ณด๋ค โ์ค์ โํ ์คํธ : ๋ชจ๋ ์ฌ์ฉ์๊ฐ a๋ฅผ ๋ฐ๋ฅด๋๋ก ํ
$leader_amount = rand( 0, 5 );
๋ค์$leader_amount x $random_ids = rand( 0, 47000 );
๊ฐ ์ฌ์ฉ์ ์ ์๋ฅผ ์ถ๊ฐํ์ญ์์ค . ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ๊ฒ์ : ์ฌ์ฉ์๊ฐ ์๋ก๋ฅผ ๋ฐ๋ผ ๊ฐ๋ฉด ๋ด ์๋ฃจ์ ์ด ๋งค์ฐ ๋์ ๊ฒ์ ๋๋ค. ์ถ๊ฐ : ํ ์คํธ๋ฅผ ์ํ ํ ๋ฐฉ๋ฒ๊ณผ ํ์ด๋จธ๋ฅผ ์ ํํ ์ถ๊ฐ ํ ์์น๋ฅผ ๋ณด์ฌ์ค๋๋ค.๋ํ ๋ฃจํ๋ฅผ ํจ๊ป ๊ณ์ฐํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ โ ์์ ์๊ฐ ์ถ์ ์ ์ค์ ๋ก ์ธก์ ํ ์ ์๋ค๊ณ ์ธ๊ธํด์ผํฉ๋๋ค. ๋ ๋ฒ์งธ ๋ฃจํ์์ ๊ฒฐ๊ณผ ID ์ธํธ๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฌ๊ธฐ์ ์ถ๊ฐ ๊ณผ์