如何让砌体和图像加载到与 Wordpress 一起使用

Has*_*len 1 javascript wordpress wordpress-theming imagesloaded masonry

在 20 分钟之后大约 4 小时,我预计需要使用一些新的 wordpress 主题来设置砌体,我决定最好寻求帮助。

我的 html 模型站点中加载的图像可以正常工作,这是精简的 html 代码。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script src="imagesloaded.pkgd.min.js"></script>
<script src="masonry.pkgd.min.js"></script>
</head>

<body>

<div class="masonry-container js-masonry"  data-masonry-options='{ "isFitWidth": true }'>

    <div class="block-wrapper">content</div>

    <div class="block-wrapper">content</div>

    <div class="block-wrapper">content</div>

</div><!-- end masonry-container js-masonry -->

<script>
var container = document.querySelector('.masonry-container');
var msnry;
// initialize Masonry after all images have loaded
imagesLoaded( container, function() {
    msnry = new Masonry( container );
});
</script>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

问题:

我如何让它与 Wordpress 一起工作?


到目前为止我尝试过的

几乎所有我能想出的东西。(我数了 40 多个打开的选项卡试图找到答案)这是我开始时的简单变化..

在functions.php中(函数中绝对没有其他东西)

function enqueue_masonry() {
    wp_enqueue_script('masonry');
}
add_action('wp_enqueue_scripts','enqueue_masonry');
Run Code Online (Sandbox Code Playgroud)

在footer.php中(图片加载)

<script>
var container = document.querySelector('.masonry-container');
var msnry;
// initialize Masonry after all images have loaded
imagesLoaded( container, function() {
msnry = new Masonry( container );
});
</script>

</body>
Run Code Online (Sandbox Code Playgroud)

在 index.php 中(也尝试从 functions.php 而不是在 html 中初始化)

<div class="masonry-container js-masonry"  data-masonry-options='{ "isFitWidth": true }'>
Run Code Online (Sandbox Code Playgroud)

在 header.php 中

<?php wp_head(); ?> 
</head>
Run Code Online (Sandbox Code Playgroud)

笔记

  • 禁用所有插件
  • 它是一个自定义的父主题
  • 功能目前是空的,除了上面写的
  • wordpress 4.2.2 版,js 文件夹中的 masonry 确认
  • 我读过 ImagesLoaded 内置于 wordpress 的砖石结构中

我猜

这是显而易见的事情

Has*_*len 5

答案

我自己的问题的令人尴尬的简单答案是我忘记包含<?php wp_footer(); ?>在 footer.php 文件中。

然而,第二天,我发现 ImagesLoaded 并没有像人们预期的那样从页脚启动,因此此答案已被重新编辑以显示我如何让 ImagesLoaded 正常工作。

我应该注意到 Masonry 是从 html 页内选项方法正确启动的,但帮助文件没有显示使用相同的页内方法启动 ImagesLoaded 的方法。


背景故事(一些可能对其他人有用的信息)

第二天,在向测试博客添加了一些带有缩略图的测试帖子后,我发现 ImagesLoaded 没有初始化并且所有块都相互重叠。

然后我发现尝试使用来自 footer.php 的 Javascript 初始化 Masonry 也根本不起作用。

又过了一两个小时试图弄清楚为什么这两个脚本都不会从 footer.php 或 header.php 初始化我放弃并回到这个建议

..为什么不直接将它添加到 .js 文件中,并通过对砌体脚本的加载依赖将它排入队列?这样您就不必通过钩子手动将 jQuery 代码添加到页眉/页脚。

然后我又发现了这个问题和答案如何使砌体和图像加载正确工作。(wordpress)并解释如何执行此操作。

多亏了这两个人,我将再次编辑它,并向您展示我是如何让 Wordpress 与 Masonry 正常工作的,它现在是内置的 ImageLoaded。


关于如何将砌体添加到您的 Wordpress 主题的一种方法

目标

  1. 在您的 wordpress 主题上安装 Masonry,使其表现得像 Pinterest。
  2. 使页面居中。
  3. 防止在每个块元素的顶部堆叠/重叠。

一些事情要知道

  • 当前的 Wordpress 版本(3.9? 到 4.2.2+)与 Masonry 打包在一起。
  • 位置 - wp-includes/js/masonry.min.js
  • 这个 Wordpress 版本的 Masonry 包括内置的 ImagesLoaded。
  • Masonry 不再需要 Jquery,虽然我能找到的让它在 Wordpress 中初始化的唯一方法需要一点点。

安装和设置


在functions.php中

// to use scripts with wordpress they must first be enqueued
function enqueue_scripts() {
    wp_enqueue_script('masonry');
    wp_enqueue_script('masonryloader', get_stylesheet_directory_uri() . '/js/TaS-masonryInitializer.js', array( 'masonry', 'jquery' ) );
}
add_action('wp_enqueue_scripts','enqueue_scripts');
Run Code Online (Sandbox Code Playgroud)

笔记

  • 因为 Wordpress 可能使用其他脚本,您安装的插件可能依赖于其他一些“排队脚本”,这是 Wordpress 管理它们的方式,以免相互冲突。我会详细介绍,但我没有资格这样做。
  • 您可能会在其他一些网站上看到显示您必须先注册 Masonry 的示例。并非如此,因为它包含在 Wordpress 中,因此已经注册。
  • 我们在这里排队的两个脚本是第一个 Masonry 和第二个我们的小脚本来初始化 masonry。
  • Jquery 也在 uhh,作为小 Initializer 脚本工作的依赖项排队。

在您的主题文件夹中(例如 /wp-content/themes/yourThemeName/)

  1. 创建一个名为“js”的文件夹

  2. 在该文件夹内创建一个名为 TaS-masonryInitializer.js 的文件

    • 它应该看起来像这样 /wp-content/themes/yourThemeName/js/TaS-masonryInitializer.js
  3. 将此 Javascript 复制并粘贴到该文件中。

    (function( $ ) {
    "use strict";
    $(function() {
        // set the container that Masonry will be inside of in a var
        // adjust to match your own wrapper/container class/id name
        var container = document.querySelector('.masonry-container');
        //create empty var msnry
        var msnry;
        // initialize Masonry after all images have loaded
        imagesLoaded( container, function() {
            msnry = new Masonry( container, {
                // adjust to match your own block wrapper/container class/id name
                itemSelector: '.block-wrapper',
                // option that allows for your website to center in the page
                isFitWidth: true
            });
        });
    });
    }(jQuery));
    
    Run Code Online (Sandbox Code Playgroud)

笔记

  • 这一步是初始化 Masonry 和 ImagesLoaded 并调整 Masonry 的选项
  • 如前所述,ImagesLoaded 内置在 Masonry 的 wordpress 版本中,因此无需像在直接的 html 站点上那样将其单独放入 functions.php 中。
  • 测量每个图像的高度,它包含块 ImagesLoaded 用于在确定这些高度之前阻止 Masonry 加载。这种暂停/顺序允许 Masonry 正确计算每个块的高度。如果您height: auto;在图像上使用,这一点很重要,就像许多响应式设计一样。
  • 假设您的页面宽度是响应式的并且设置为 100%/不固定,Masonry 需要确定 100% 的宽度实际上能够使您的网站在页面上居中。选项"isFitWidth": true是如何做到这一点。在此处阅读更多相关信息。
  • 您可以通过让 masonry 选择第一个块的宽度并将其应用为列宽来分配列宽,或者您可以按照此页面在选项中明确说明列宽。
  • .masonry-container 是容器的类,它环绕着你想要像砌体一样表现的所有块
  • 如果您愿意,它也可以是一个 ID #masonry-container
  • 它可以是任何名称,只是一定要在上面的函数中进行调整
  • 上面的代码取自如何使砌体和图像加载正确工作。(wordpress)以及 Masonry 自己的说明

在 index.php(或其他模板文件中,具体取决于您要使用砌体的站点的位置)

<div class="masonry-container js-masonry">

    <div class="block-wrapper">content</div>

    <div class="block-wrapper">content</div>

    <div class="block-wrapper">content</div>

</div><!-- end masonry-container js-masonry -->
Run Code Online (Sandbox Code Playgroud)

笔记

  • 类“masonry-container”可以是一个类或一个 id 并且可以是您选择的任何名称,只需确保在 TaS-masonryInitializer.js 文件中对其进行调整
  • 在我的记忆中,Masonry 需要类“js-masonry”才能找到打开的 div,并且在不干预脚本本身的情况下无法重命名。
  • 每个归类为“块包装器”的 div 是一个不同的块元素,您正在对其应用砌体对齐效果。
  • “block-wrapper”,就像“masonry-container”一样,可以是你选择的任何名字,可以是 id 或 class。

在页脚.php

确保wp_footer()在您的结束正文标签之前包含。

<?php wp_footer(); ?>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

笔记

  • wp_footer 由 wordpress 使用,可通过一个操作在您的页面上启用脚本。您在functions.php 中排队的脚本被挂接到wp_footer。(请原谅我的术语,我确定我在那里误用了几个词)

在 header.php 中

确保你有..

<?php wp_head(); ?>
Run Code Online (Sandbox Code Playgroud)

就在之前 </head>

并且由于现在大多数人可能将 Masonry 用于移动友好的网站,因此请务必包含以下代码(再次,在 head 和 /head 之间)以使事情在移动浏览器上工作..

<meta name="viewport" content="width=device-width, initial-scale=1">
Run Code Online (Sandbox Code Playgroud)

请让我知道我有任何误解和我忽略的错误,我会尽力纠正它们。


疯狂道具大卫德桑德罗写了一个很好的剧本。看看他的网站,他创造了其他一些很酷的东西。