В настоящее время я работаю над сайтом Wordpress, одной из задач которого было создание пользовательских типов постов, которые я смог сделать.Затем я использовал фильтр, который я написал в functions.php, чтобы включить отдельный файл location.php, который я написал, для отображения на страницах с типами сообщений о местоположении.См. Фильтр ниже:
add_filter('the_content', 'prepend_location_data' );
function prepend_location_data( $content ){
if( is_singular('location')){
$html=include("locations.php");
return $content . $html;
}
return $content;
}
Затем я смог использовать плагин ACF, чтобы добавить настраиваемые поля в сообщения о моих местоположениях и отображать их с помощью функций ACF на моей странице location.php.Моя следующая задача - добавить виджет или меню в верхней части всех страниц, чтобы отобразить определенный номер телефона в зависимости от IP-адреса пользователя.Мне удалось написать php-функцию в файле location.php, который я создал и который получает IP-адрес пользователя, использует IP-адрес для определения города IP-адреса, а затем, если этот город равен городу, включенному в одно из пользовательских полей городаЯ создал это вернет номер телефона для этого города.См. Функции ниже:
<?php
function get_the_user_ip() {
if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
//Checks if IP is from shared internet
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
//Checks if IP is passed from proxy
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else {
//Most trustworthy source of IP address
$ip = $_SERVER['REMOTE_ADDR'];
}
//Uses ipinfo.io to find location information based on IP address
$details = json_decode(file_get_contents("https://ipinfo.io/{$ip}"));
//Returns city value from the details array
$city=$details->city;
return apply_filters('wpb_get_ip', $city );
}
function display_phone(){
$cityField=get_field('city');
$phoneField=get_field('phone_number');
//Assigns the return value of get_the_user_ip to a variable
$userCity=get_the_user_ip();
if($userCity==$cityField){
return ($phoneField);
}
}
add_shortcode('show_phone', 'display_phone');
?>
Проблема в том, что шорткод будет работать только на страницах местоположений.Я понимаю, что мне нужно как-то передать возвращаемое значение функции display_phone обратно в файл functions.php или, возможно, просто выполнить всю эту логику внутри functions.php для начала.У кого-нибудь есть предложения о том, что можно попробовать или где посмотреть?Могу ли я использовать функции ACF в моем файле functions.php?Должен ли я использовать функцию Javascript для этого?Любой совет приветствуется.

Я также пробовал следующие модификации функции display_phone безрезультатно.
function display_phone(){
global $post;
$current_id = $post->ID;
$cityField=get_field('city', $post->ID);
$phoneField=get_field('phone_number');
//Assigns the return value of get_the_user_ip to a variable
$userCity=get_the_user_ip();
if($userCity==$cityField){
return ($phoneField);
}
}
следующая модификация функции display_phone:
function display_phone(){
global $post;
$current_id = $post->ID;
$cityField=get_field('city', $current_id);
$phoneField=get_field('phone_number');
//Assigns the return value of get_the_user_ip to a variable
$userCity=get_the_user_ip();
if($userCity==$cityField){
return ($phoneField);
}
}
ОБНОВЛЕНИЕ: Хорошо, поэтому, подумав немного об этом, я думаю, мне нужно написать функцию, которая будет проходить по всему городуи поля телефонных номеров типов сообщений о местоположении, чтобы увидеть, совпадают ли они с городом, возвращаемым функцией get_the_user_ip.Очевидно, что для этого нужно изменить функцию дисплея телефона, и я думаю, что мне придется убрать обе функции из location.php и, возможно, выполнить эту логику в файле header.php.У кого-нибудь есть опыт в создании чего-то подобного или какой-либо совет, как это сделать?Я не совсем уверен, как пройтись по полевым данным моих типов сообщений о местоположении, если я на самом деле не делаю логику внутри сообщения.Я понимаю, что это можно решить, используя жестко запрограммированный массив городов и телефонных номеров, но я пытаюсь избежать этого и использовать вместо этого плагин ACF.
ОБНОВЛЕНИЕ: Итак, я взял логику со страницы location.php и переместил ее в конец файла functions.php.Прямо сейчас он печатает правильный номер телефона вверху каждой загружаемой страницы, но только на секунду.Таким образом, похоже, что следующим шагом в этом процессе будет присвоение этого номера переменной и как-то ее передача через функцию, чтобы затем я мог назначить шорткод и использовать по всему сайту.
<?php
function get_the_user_ip() {
if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
//Checks if IP is from shared internet
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
//Checks if IP is passed from proxy
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else {
//Most trustworthy source of IP address
$ip = $_SERVER['REMOTE_ADDR'];
}
//Uses ipinfo.io to find location information based on IP address
$details = json_decode(file_get_contents("https://ipinfo.io/{$ip}"));
//Returns city value from the details array
$city=$details->city;
return apply_filters('wpb_get_ip', $city );
}
$posts = get_posts(array(
'posts_per_page' => -1,
'post_type' => 'location'
));
$userCity=get_the_user_ip();
if( $posts ):
foreach( $posts as $post ):
$cityField=get_field('city');
//echo "$cityField";
$phoneField=get_field('phone_number');
//echo "$phoneField";
if($userCity==$cityField){
echo ($phoneField);
}
endforeach;
wp_reset_postdata();
endif;
?>