从PHP获取数据到JavaScript以设置每个帖子在首页上的位置

时间:2019-08-17 作者:practicemakesperfect

我为我的Wordpress主题创建了一个名为project的自定义帖子类型,效果很好。每个项目都有几个自定义字段,包括一组x和y值,它们指示项目应显示在首页的位置(请参阅下面代码的样式部分:我知道它不起作用,但我正在显示我想要在伪代码中实现的目标)。

我可以将x值显示为<?php the_field(\'x\'); ?><?php the_field(\'y\'); ?>, 如WordPress的高级自定义字段文档所定义。但是,如何从PHP到JavaScript获取x和y值,以便使用它们设置lefttop div的值,该值指示它们应该出现在首页的位置?

考虑到有许多项目,并且我在一个循环中得到了不同的xs和ys集,我考虑将所有x和y值写入一个外部json文件,然后用JavaScript将它们加载回来。考虑到WordPress的结构,这是一个可行的选择吗?或者,有没有更好的方法将这些x和y值从PHP转换为JavaScript?我知道AJAX总是一种选择,但我想知道是否有更简单的方法,因为我几乎可以在DOM中获得这些精确的值对。。。

<?php  

    $args = array(
        "post_type" => "project"
    );

    $projects = new WP_Query($args);

    while($projects->have_posts()){
        $projects->the_post();
?>

    <a class="project" href="<?php the_permalink(); ?>" style="top:x\'px\'; left: y\'px\'">
        <p><?php the_field("title"); ?></p>
    </a>

<?php
    }
?>

2 个回复
SO网友:cbirdsong

您可以将它们作为内联输出CSS custom properties 而不是左/上,然后使用它们在CSS或Javascript中设置位置。

PHP:

<a class="project" href="<?php the_permalink(); ?>" style="—-x-position: <?php the_field(\'x\'); ?>; —-y-position: <?php the_field(\'y\'); ?>;\'">
    <p><?php the_field("title"); ?></p>
</a>
CSS:

.project {
    top: var(—-x-position);
    left: var(—-y-position);

    /* or CSS grid: */
    grid-row-start: var(—-x-position);
    grid-column-start: var(—-y-position);
}
如果您需要,也可以在JS中访问它们:

var x_position = element.style.getPropertyValue("--x- position");
这对于响应性设计将更易于管理,因为您不必使用!important, 但输入这种特定的x/y值通常是个坏主意,最好不要将演示文稿与数据直接混合在一起。

SO网友:Rendy de Puniet

您可以使用wp_localize_script() 函数将值传递给js。例如

add_action( \'wp_enqueue_scripts\', \'my_custom_scripts\' );

public function my_custom_scripts() {
    wp_enqueue_script( \'custom-script\', get_stylesheet_directory_uri() . \'/js/custom_script.js\', [\'jquery\'] );
    wp_localize_script( \'custom-script\', \'myScript\', [
        \'var_a\' => \'value_a\',
        \'var_b\' => \'another value\',
    ] );
}
在自定义脚本中。js您可以得到如下值

console.log(myScript.var_a) // will return `value_a`
console.log(myScript.var_b) // will return `another value`