DNI 显示 div 基于着陆页,继续显示 div 整个会话
DNI show div based on landing page, continue showing div entire session
我有大约 60 个使用不同 phone 编号的着陆页。我结合使用 WordPress 和高级自定义字段将 phone 数字放在各自的页面上。
我被要求显示基于着陆页 URL 的 <div>
,它不仅会显示分配给该页面的 phone 编号,而且会继续显示 <div>
(和 phone 数字),无论用户导航到网站上的哪个页面。
我发现几乎没有人支持如何使 <div>
在整个会话期间保持可见,直到用户关闭 window。
我认为这将以某种方式围绕 cookie 和动态数字插入展开,但我没有真正的进展可言。这应该使用 PHP 还是 JS 来完成?是否存在允许在 WordPress 上执行此操作的插件?我愿意接受所有建议。
您应该使用 PHP 并捕获会话。
(未经测试的代码警告)
add_action('wp_footer', 'dynamic_phone_div');
function dynamic_phone_div() {
session_start;
if(isset($_SESSION['phone_div']) ? $phone_div = $_SESSION['phone_div'] :
$phone_div = '';
if($phone_div != '') {
echo '<div class="that_div_thing">';
echo $phone_div;
echo '</div>';
} else {
$_SESSION['phone_div'] = 123456789;
echo '<div class="that_div_thing">';
echo '123456789';
echo '</div>';
}
}
这只是原始逻辑。我不确定您的 div 在哪里 (header/footer/page) - 根据它的位置,您应该使用挂钩 (header/footer) 或将其编码到模板中 (page/post ).
会话将在用户关闭tab/window后销毁。
我可能会使用客户端会话存储来执行此操作。如果所有页面都在同一个选项卡中打开,该值将为会话保留,然后被删除。
PHP 代码(在您的 functions.php 文件中?)将是这样的:
function phone_script() {
$params = array(
'phone_number' => null, // Insert logic for current number. Can stay null if this is running on a non-landing page
'is_landing_page' => false // Change to true/false based on is current page a landing one or not
);
$params = json_encode( $params );
echo <<< EOT
<script>
let settings = $params;
document.addEventListener("DOMContentLoaded", function() {
if( settings.is_landing_page ) {
window.sessionStorage.setItem( 'phone-number', settings.phone_number );
} else {
settings.phone_number = window.sessionStorage.getItem( 'phone-number' );
}
if( settings.phone_number ) {
let div = document.createElement('div');
div.classList.add('phone-div');
// or add inline style
// div.style.cssText = 'position:fixed'; //etc
// Some logic here to actually add the number and any other content to the div
div.innerHTML = `The Phone number is: ${settings.phone_number}`;
document.body.appendChild(div);
}
});
</script>
EOT;
}
add_action( 'wp_footer', 'phone_script');
注意EOT;行必须没有前导或尾随空格。
以上未经测试
请尝试此代码。就像@John C 提到的那样,WP Engine 出于性能和安全的考虑,不推荐使用 Cookie 或 PHP Session。这是纯 JavaScript 代码,我认为这会解决您的问题。
您的 Post/Page 模板文件中的代码:
<div id="phone-number"></div>
<?php if( get_field('phone_number') ): ?>
<script type="text/javascript">
let phone_number = "<?php the_field('phone_number'); ?>";
</script>
<?php endif; ?>
您的主题 JavaScript 文件中的代码:
<script type="text/javascript">
// in the case of the div data is persistent on the same site
// let storage = localStorage;
// in the case of the div data is persistent in the same tab, but not in new tab
let storage = sessionStorage;
let key = "phone_number"; // storage key
var global_phone_number = storage.getItem(key);
// check if storage data is set before
if (null === global_phone_number) {
// if not set the data on page into storage
global_phone_number = phone_number ? phone_number : '';
storage.setItem(key, global_phone_number);
}
document.getElementById('phone-number').innerHTML = global_phone_number;
</script>
我有大约 60 个使用不同 phone 编号的着陆页。我结合使用 WordPress 和高级自定义字段将 phone 数字放在各自的页面上。
我被要求显示基于着陆页 URL 的 <div>
,它不仅会显示分配给该页面的 phone 编号,而且会继续显示 <div>
(和 phone 数字),无论用户导航到网站上的哪个页面。
我发现几乎没有人支持如何使 <div>
在整个会话期间保持可见,直到用户关闭 window。
我认为这将以某种方式围绕 cookie 和动态数字插入展开,但我没有真正的进展可言。这应该使用 PHP 还是 JS 来完成?是否存在允许在 WordPress 上执行此操作的插件?我愿意接受所有建议。
您应该使用 PHP 并捕获会话。
(未经测试的代码警告)
add_action('wp_footer', 'dynamic_phone_div');
function dynamic_phone_div() {
session_start;
if(isset($_SESSION['phone_div']) ? $phone_div = $_SESSION['phone_div'] :
$phone_div = '';
if($phone_div != '') {
echo '<div class="that_div_thing">';
echo $phone_div;
echo '</div>';
} else {
$_SESSION['phone_div'] = 123456789;
echo '<div class="that_div_thing">';
echo '123456789';
echo '</div>';
}
}
这只是原始逻辑。我不确定您的 div 在哪里 (header/footer/page) - 根据它的位置,您应该使用挂钩 (header/footer) 或将其编码到模板中 (page/post ).
会话将在用户关闭tab/window后销毁。
我可能会使用客户端会话存储来执行此操作。如果所有页面都在同一个选项卡中打开,该值将为会话保留,然后被删除。
PHP 代码(在您的 functions.php 文件中?)将是这样的:
function phone_script() {
$params = array(
'phone_number' => null, // Insert logic for current number. Can stay null if this is running on a non-landing page
'is_landing_page' => false // Change to true/false based on is current page a landing one or not
);
$params = json_encode( $params );
echo <<< EOT
<script>
let settings = $params;
document.addEventListener("DOMContentLoaded", function() {
if( settings.is_landing_page ) {
window.sessionStorage.setItem( 'phone-number', settings.phone_number );
} else {
settings.phone_number = window.sessionStorage.getItem( 'phone-number' );
}
if( settings.phone_number ) {
let div = document.createElement('div');
div.classList.add('phone-div');
// or add inline style
// div.style.cssText = 'position:fixed'; //etc
// Some logic here to actually add the number and any other content to the div
div.innerHTML = `The Phone number is: ${settings.phone_number}`;
document.body.appendChild(div);
}
});
</script>
EOT;
}
add_action( 'wp_footer', 'phone_script');
注意EOT;行必须没有前导或尾随空格。
以上未经测试
请尝试此代码。就像@John C 提到的那样,WP Engine 出于性能和安全的考虑,不推荐使用 Cookie 或 PHP Session。这是纯 JavaScript 代码,我认为这会解决您的问题。
您的 Post/Page 模板文件中的代码:
<div id="phone-number"></div>
<?php if( get_field('phone_number') ): ?>
<script type="text/javascript">
let phone_number = "<?php the_field('phone_number'); ?>";
</script>
<?php endif; ?>
您的主题 JavaScript 文件中的代码:
<script type="text/javascript">
// in the case of the div data is persistent on the same site
// let storage = localStorage;
// in the case of the div data is persistent in the same tab, but not in new tab
let storage = sessionStorage;
let key = "phone_number"; // storage key
var global_phone_number = storage.getItem(key);
// check if storage data is set before
if (null === global_phone_number) {
// if not set the data on page into storage
global_phone_number = phone_number ? phone_number : '';
storage.setItem(key, global_phone_number);
}
document.getElementById('phone-number').innerHTML = global_phone_number;
</script>