【问题标题】:How to pass a WordPress post ID to HTML5 local storage如何将 WordPress 帖子 ID 传递到 HTML5 本地存储
【发布时间】:2016-04-20 10:12:42
【问题描述】:

我有一个 WordPress 网站,其中列出了同位素布局中的自定义帖子类型项目。每个项目都有一个收藏按钮。一旦你喜欢它,一颗星将通过 CSS 突出显示。当您转到该项目时,我希望能够看到该项目已被收藏。

我刚刚意识到我拥有的脚本没有存储该按钮的 ID,因此它不会显示在单个页面上,而是显示在收藏它的页面上。这是脚本:

  if (typeof(localStorage) == 'undefined') {
    document.getElementById("result").innerHTML =
      'Your browser does not support HTML5 localStorage. Try upgrading.';
  } else {
      $(".grid-item").each(function(i, el) {
        if (localStorage['fav' + i] == 'addfave') {
          $(this).addClass('addfave');
        }
      });
  }

  $(document).ready( function() {

    // ADD FAVE


    $( ".fav" ).click(function(e) {

      e.preventDefault();

      var $item = $(this).closest('.grid-item');
      var index = $('.grid-item').index($item);

      //localStorage.removeItem('background');
      $item.toggleClass('addfave');

      if ($item.hasClass('addfave')) {
        console.log(index)
        localStorage.setItem('fav' + index, 'addfave');
      } else {
        localStorage.removeItem('fav' + index);

        if (localStorage['fav' + i] == null) {
        }
      }
    });
  });

我的按钮看起来像这样,我使用 CSS 在 span 标签中显示星号

<a href="#" id="fav<?php echo $post->ID; ?>" class="fav" title="[+] Add as favorite"><span></span></a>

【问题讨论】:

  • 将您的帖子 ID 保存在 localStorage 和单个帖子/页面以匹配 localStorage 中的 ID。修改脚本jsfiddle.net/user5200704/tkuqwdvg
  • 你试过我下面的答案了吗?

标签: javascript jquery wordpress html


【解决方案1】:

您的链接 ID 中已经有一个帖子 ID,因此无需重做,您只需将使用它们的索引号识别网格项目更改为使用帖子 ID。

if (typeof(localStorage) == 'undefined') {
    document.getElementById("result").innerHTML =
      'Your browser does not support HTML5 localStorage. Try upgrading.';
  } else {
    console.log(localStorage);

      $(".fav").each(function(i, el) {
        if (localStorage[el.id] == 'addfave') {
          $(this).closest('.grid-item').addClass('addfave');
        }
      });
  }

  $(document).ready( function() {

    // ADD FAVE


    $( ".fav" ).click(function(e) {

      e.preventDefault();

      var $item = $(this).closest('.grid-item');
      var index = this.id;

      //localStorage.removeItem('background');
      $item.toggleClass('addfave');

      if ($item.hasClass('addfave')) {
        localStorage.setItem( index, 'addfave');
      } else {
        localStorage.removeItem(index); 
      }
    });
  });

为了演示看看下面的jsfiddle,它不是很精彩,但收藏时会变红,你可以添加更多的网格项目并改变顺序,它会收藏正确的项目。

https://jsfiddle.net/a71b4zd8/6/

现在我不知道您所说的单页是什么意思,但我假设是单页模板。上述功能不适用于在该页面上标记收藏。我不知道您的 html 结构,但用于唯一标识页面的典型 id 可能是 post-{$postif}

在创建脚本以检查帖子 ID 时,您应该允许这样做。

【讨论】:

  • 谢谢大卫。我尝试了这个脚本,它在使用 ID 来支持网格时起作用。不过,我仍然需要将本地存储与单个页面上的帖子 ID 进行比较。
  • 这很容易,用你的 html 提出一个新问题并用链接回复
【解决方案2】:

这需要一些script localization。在将脚本排入队列的位置,您可以执行以下操作:

global $post;
wp_localize_script( 'main-js', 'my_object', array( 'post_id' => $post->ID ) );

main-js 应该是您希望在其之前输出本地化脚本内容的脚本的名称。

然后在您的 javascript 文件中,您可以访问此对象及其 post_id 属性,并使用以下值执行您想要的操作:

var post_id = my_object.post_id;

【讨论】:

  • 您好,感谢您的回答。我是这个脚本本地化的新手。那 main-js 是一个文件,对吧?我正在使用 FoundationPress,所以我的所有脚本都放在 assets/javascript/custom/myscript.js 的文件夹中。所以我应该把 main-js.js 放到同一个目录吗?脚本本地化如何找到该文件?
  • main-js 是按 Wordpress 所希望的方式排队时分配给脚本的名称(只是一个示例,您可以将其命名为其他名称。)如果您没有将自定义排队我可能会建议您这样做,以便您可以本地化脚本等。让我看看 FoundationPress,因为我不熟悉它,我将编辑我的答案并进一步澄清。
  • 其实是在 enqueue-scripts.php 上排队的。该文件的名称是foundation.js,所以“foundation”是我用你的main-js 替换的名称。但我有一个 custom.js,npm 在foundation.js 上重建。 custom.js 是我拥有所有自定义脚本的地方,但它在foundation.js 下都被缩小了。现在我收到Uncaught ReferenceError: my_object is not defined
  • 嘿等等,我想我明白了。我将 wp_local_script 放在 enqueque 脚本之后,错误就消失了。让我尝试将此 ID 合并到收藏按钮中,然后我会回到这里。
  • 啊,好吧。正在编辑我的答案,但似乎你已经明白了。页面底部的快速查看源代码将确认带有my_object 的脚本标记在foundation.js 之前输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多