В настоящее время я работаю над сайтом 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;
?>
Я думаю, что вам также необходимо предоставить идентификатор страницы, иначе как WordPress узнает, какой номер телефона использовать? Так
get_field('city');
станет
get_field('city', $post->ID);
Вы можете получить идентификатор текущей страницы, используя ниже в вашей функции display_phone:
global $post;
$current_id = $post->ID;
ОБНОВИТЬ:
Похоже, ты в порядке. Как вы сказали, все, что вам нужно сделать, это создать короткий код для его вызова.
function rusty_showphone() {
$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');
$phoneField=get_field('phone_number');
if($userCity==$cityField){
return $phoneField;
}
endforeach;
wp_reset_postdata();
endif;
}
add_shortcode('showphone', 'rusty_showphone');
Поэтому я нашел решение. Если у кого-то есть какие-либо предложения о том, как я могу сделать что-то лучше, было бы здорово.
Сначала я создал новый файл в моей дочерней теме WordPress под названием phone-display.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;
?>
Затем я добавил этот пользовательский элемент div, где я хотел, чтобы номер телефона отображался.
<div id="phone"></div>
Затем я добавил этот код JavaScript в нижней части моего footer.php
файл.
<script>document.getElementById("phone").innerHTML = '<?php include("phone-display.php"); ?>';</script>