Я пытаюсь добавить виджет или меню в начало всех моих страниц Wordpress. - PullRequest
0 голосов
/ 04 октября 2018

В настоящее время я работаю над сайтом 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 для этого?Любой совет приветствуется.

Phone number would display here at the top right of the menu

Я также пробовал следующие модификации функции 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; 


?>

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Итак, я нашел решение.Если у кого-то есть какие-либо предложения о том, как я могу сделать что-то лучше, это было бы здорово.

Сначала я создал новый файл в своей дочерней теме 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>
0 голосов
/ 04 октября 2018

Я думаю, что вам нужно указать идентификатор страницы, иначе как 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...