这是可能的,假设您想影响所有这样的post查询,您将需要获得原产国,然后更改查询。如果你有两类新闻,比如俄罗斯新闻和日本新闻,你基本上可以这样做:
/**
* Returns origin country of request if available
*
* @return mixed false (not available to retrieve) or country code (string)
*/
function get_country_of_visitor() {
$data = json_decode(file_get_contents(\'http://ip-api.com/json/\' . $_SERVER[\'REMOTE_ADDR\']), true);
// Return countryCode only if available in
if (isset($data[\'countryCode\'])) {
return $data[\'countryCode\'];
}
return false;
}
/**
* Wrapper function for get_country_of_visitor() and condition
* @uses get_country_of_visitor()
* @return bool Is japanese?
*/
function is_japanese() {
$country = get_country_of_visitor();
return $country === \'JP\';
}
/**
* Wrapper function for get_country_of_visitor() and condition
* @uses get_country_of_visitor()
* @return bool Is russian?
*/
function is_russian() {
$country = get_country_of_visitor();
return $country === \'RU\';
}
/**
* Change query when needed
*
* @uses https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts
*/
function wpse331934_alter_query($query) {
$tax_query = false;
// Conditionally set tax_query
if ( is_japanese() ) {
$tax_query = [
[
\'taxonomy\' => \'category\',
\'field\' => \'name\',
\'terms\' => \'Japanese news\'
]
];
} else if ( is_russian() ) {
$tax_query = [
[
\'taxonomy\' => \'category\',
\'field\' => \'name\',
\'terms\' => \'Russian news\'
]
];
}
// Set query for category if specified
if ( $tax_query ) {
$query->set( \'tax_query\', $tax_query );
}
return $query;
}
add_action( \'pre_get_posts\', \'wpse331934_alter_query\' );
如你所见
wpse331934_alter_query
在里面
pre_get_posts hook 通过添加tax\\u query(如果存在任何条件)更改查询
is_japanese()
或
is_russian()
返回true。
如你们所说,若你们只想在主页上这样做,你们可以为你们可以使用的主页添加任何其他条件is_front_page() 在pre\\u get\\u posts挂钩中。
/**
* Change query when needed
*
* @uses https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts
*/
function wpse331934_alter_query($query) {
$tax_query = false;
// Conditionally set tax_query
if ( is_front_page() && is_japanese() ) {
$tax_query = [
[
\'taxonomy\' => \'category\',
\'field\' => \'name\',
\'terms\' => \'Japanese news\'
]
];
} else if ( is_front_page() && is_russian() ) {
$tax_query = [
[
\'taxonomy\' => \'category\',
\'field\' => \'name\',
\'terms\' => \'Russian news\'
]
];
}
// Set query for category if specified
if ( $tax_query ) {
$query->set( \'tax_query\', $tax_query );
}
return $query;
}
add_action( \'pre_get_posts\', \'wpse331934_alter_query\' );
请注意
is_front_page()
作为第一个条件,这样你就可以节省一次,甚至两次
get_country_of_visitor()
如果你不在头版。不管怎样,这么说,
get_country_of_visitor()
在本例中,依赖于第三方(可以随时更改)并发送远程请求。因此,我不会在生产中这样使用它。希望您能够想出不同的方法来声明请求的来源,而不必在每次请求页面时都从第三方请求。