2

我目前在一个 Wordpress 网站上工作,其中一项任务是创建我能够做到的自定义帖子位置帖子类型。然后,我使用我在functions.php 中编写的过滤器来包含我编写的单独的locations.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 函数在我的 locations.php 页面上显示它们。我的下一个任务是在所有页面的顶部添加某种小部件或菜单,以根据用户 IP 显示特定的电话号码。我能够在我创建的locations.php文件中编写一个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 中执行所有这些逻辑。有没有人对尝试的事情或去哪里有任何建议?我可以在我的functions.php 中使用ACF 函数吗?我应该使用 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 函数返回的城市匹配。显然,必须修改显示电话功能才能做到这一点,我想我必须将这两个功能都从 locations.php 中取出,并且可能在 header.php 文件中执行这个逻辑。有没有人有做类似事情的经验或关于如何做到这一点的任何建议?我不确定如何遍历我的位置帖子类型的字段数据,除非我实际上是在帖子中执行逻辑。我意识到这可以通过使用硬编码的城市和电话号码数组来解决,但我试图避免这种情况并改用 ACF 插件。

更新: 所以我从locations.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; 


?>
4

2 回答 2

0

我认为您还需要提供页面 ID,否则 WordPress 将如何知道要使用哪些位置的电话号码?所以

get_field('city');

会变成

get_field('city', $post->ID);

您可以在 display_phone 函数中使用以下内容获取当前页面 ID:

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');
于 2018-10-04T16:48:04.503 回答
0

所以我找到了解决方案。如果有人对我如何做得更好有任何建议,那就太好了。

首先,我在我的 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>
于 2018-10-08T21:59:20.753 回答