在php和wordPress中的Rhyzz可重复字段

时间:2017-06-09 作者:HunterFord

我很难弄明白为什么我的可重复字段javascript不能工作。我正在使用以下插件:Rhyzz(可重复字段):http://www.rhyzz.com/repeatable-fields.html. 我浏览了一下网站,发现他在html中运行了脚本,也在同一个页面上运行了javascript。我的网站要大得多。我正在使用Wordpress,我做了以下操作来调用脚本functions.php.

 wp_enqueue_script( \'jquery\', \'https://code.jquery.com/jquery-1.11.2.min.js\', array(), \'20120206\', true );
 wp_enqueue_script( \'jquery-ui\', \'https://code.jquery.com/ui/1.11.4/jquery-ui.min.js\', array(), \'20120206\', true );
 wp_enqueue_script( \'jquery-repeatable\',  get_template_directory_uri() . \'/js/repeatable.js\', array( \'jquery\', \'jquery-ui\' ), \'20120206\', true );
我还有大约10个脚本。这些文件都在正确的目录中。然后,我在我的站点(PHP)上有一个特定的页面来实现可重复的字段,但所有按钮都不起作用。我在任何地方都没有以下内容,也不知道是否有必要,但在Rhyzz的网站上,他将其放入了HTML中:

jQuery(function() {
    jQuery(\'.repeat\').each(function() {
        jQuery(this).repeatable_fields();
    });
});
我很沮丧,不知道该怎么办。我也不知道我是否正确地将脚本排队,就像我应该将jquery和jquery ui传入数组字段一样。如果有人能帮我,请帮我!

注意:这是Rhyzz的GitHub,其中有一个关于如何在HTML中实现的教程,https://github.com/Rhyzz/repeatable-fields.

2 个回复
SO网友:Dave Romsey

是的,这是可行的。这里有一个经过测试的解决方案,可以帮助您启动和运行。

Enqueuing the scripts

WordPress已经包括jQuery and jQuery UI 因此,没有必要(或通常建议)从外部来源包含它们。有时,JavaScript库将使用声明性语法工作,这意味着它们可以通过使用HTML中的特定ID、类或数据属性进行初始化。其他时候(通常是这种情况),您需要包含一些额外的JavaScript来初始化您尝试使用的JavaScript库。这个可重复字段脚本似乎就是这样。

下面是将可重复字段库和初始化脚本排入队列的代码。确保路径适合您的特定设置。

add_action( \'wp_enqueue_scripts\', \'wpse_repeatable_scripts\' );
function wpse_repeatable_scripts() {
    wp_enqueue_script(
        \'jquery-repeatable\',
        get_template_directory_uri() . \'/js/repeatable-fields/repeatable-fields.js\',
        array( \'jquery\', \'jquery-ui-core\' ),
        \'20120206\',
        true
    );

    wp_enqueue_script(
        \'jquery-repeatable-init\',
        get_template_directory_uri() . \'/js/repeatable-init.js\',
        array( \'jquery-repeatable\' ),
        \'20120206\',
        true
    );  
}

repeatable-init.js

以下是repeatable-init.js, 它初始化可重复字段库,以便使用.repeat

jQuery( document ).ready( function( $ ) {
    $( ".repeat" ).each( function() {
        $( this ).repeatable_fields();
    });
});
最后,这里是HTML(通过开发人员的文档):

<div class="repeat">
    <table class="wrapper" width="100%">
        <thead>
            <tr>
                <td width="10%" colspan="4"><span class="add">Add</span></td>
            </tr>
        </thead>
        <tbody class="container">
        <tr class="template row">
            <td width="10%"><span class="move">Move</span></td>

            <td width="10%">An Input Field</td>

            <td width="70%">
                <input type="text" name="an-input-field[{{row-count-placeholder}}]" />
            </td>

            <td width="10%"><span class="remove">Remove</span></td>
        </tr>
        </tbody>
    </table>
</div>

SO网友:LWS-Mo

将测试过的代码示例添加到@DaveRomsey已经很好的答案中

可以为元框使用Rhyzz可重复字段。事实上,不久前我正在为此构建一个小的测试插件!我想得到一个简单的可重复的所见即所得字段。由于此字段类型有一些限制,因此将其替换为普通的textarea元素。

因此,以下代码未经过现场测试,不应按原样使用,但应能正常工作。

首先,我们必须将JQuery可排序字段、Rhyzz可重复字段和我们自己的JS文件排队到init。

/**
 * Enqueue our styles and scripts
 */
function prfx_enqueue_scripts() {

    // enqueue JQuery sortable
    wp_enqueue_script( \'jquery-ui-sortable\', array( \'jquery\' ) );
    // enqueue Rhyzz Repeatable-fields
    wp_enqueue_script( \'prfx-repeatable-fields-js\', plugins_url(\'/inc/repeatable-fields/repeatable-fields.js\', __FILE__), array( \'jquery\' ) );
    // enqueue init JS
    wp_enqueue_script( \'prfx-init-js\', plugins_url(\'/js/scripts.js\', __FILE__) );
}
add_action( \'admin_enqueue_scripts\', \'prfx_enqueue_scripts\', 99 );
现在,我们创建一个新的元框,仅以页面帖子类型为例。

/**
 * Create custom metabox
 */
function prfx_add_meta_boxes() {
    add_meta_box( 
        \'prfx_repeatable-fields\', 
        \'prfx_Repeatable Fields\', 
        \'prfx_callback\', // see callback function below
        \'page\', // post-type
        \'normal\', 
        \'default\'
    );
}
add_action(\'admin_init\', \'prfx_add_meta_boxes\', 1);
现在我们可以创建回调函数了。在此函数中,您将看到Rhyzz可重复字段模板的HTML表。

我无法使用占位符{{row-count-placeholder}}, 因此,我最终只是使用PHP来增加行数。

/**
 * Callback function of our fields
 */
function prfx_callback() {
    global $post;

    // check our fields
    $repeatable_fields = get_post_meta($post->ID, \'an-input-field\', true);

    // create a nonce for the field
    wp_nonce_field( \'prfx_repeatable_meta_box_nonce\', \'prfx_repeatable_meta_box_nonce\' ); ?>

<div class="repeat">
    <table class="wrapper" width="100%">
        <thead>
            <tr>
                <td width="100%" colspan="4"><span class="add button">Add Editor</span><hr></td>
            </tr>
        </thead>
        <tbody class="container">

    <?php if ($repeatable_fields) { 

        $i = 0;

         foreach ($repeatable_fields as $field) { 

            ++$i; ?>

            <tr class="row">

                <td width="100%" class="td">

                     <textarea rows="3" id="custom_editor_<?php echo $i; ?>" name="an-input-field[]" class="custom-editor-box"><?php echo $field; ?></textarea>

                     <p>
                        <hr>
                        <span class="move button">Move</span>
                        <span class="remove button">Remove</span>
                     </p>

                </td>

            </tr>

        <?php } 
    } ?>

        <!-- template row, if "Add" button is clicked, this template will show -->
        <tr class="template row">

                <td width="100%">

                    <textarea rows="3" id="custom_editor_0" name="an-input-field[]" class="custom-editor-box"></textarea>

                    <p>
                        <hr>
                        <span class="move button">Move</span>
                        <span class="remove button">Remove</span>
                    </p>

                </td>

        </tr>

        </tbody>
    </table>
</div>  
<?php }
最后,但并非最不重要的是,我们还需要一个save函数来保存可重复的字段。

/**
 * Save our metafields
 */
function prfx_repeatable_meta_box_save($post_id) {

    if ( ! isset( $_POST[\'prfx_repeatable_meta_box_nonce\'] ) ||
    ! wp_verify_nonce( $_POST[\'prfx_repeatable_meta_box_nonce\'], \'prfx_repeatable_meta_box_nonce\' ) )
        return;

    if (defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE)
        return;

    if (!current_user_can(\'edit_post\', $post_id))
        return;

    if ( isset( $_POST[\'an-input-field\'] ) ) {
        $contents = $_POST[\'an-input-field\'];
        update_post_meta( $post_id, \'an-input-field\', $contents );
    }

}
add_action(\'save_post\', \'prfx_repeatable_meta_box_save\');
这是需要的PHP代码,现在我们只需要填写scripts.js 文件如下:

jQuery(document).ready(function($){

    $(\'.repeat\').each(function() {

        $(this).repeatable_fields({
            wrapper: \'.wrapper\',
            container: \'.container\',
            row: \'.row\',
            add: \'.add\',
            remove: \'.remove\',
            move: \'.move\',
            template: \'.template\',
            is_sortable: true, 
        });

    });

});
此示例使用普通textarea元素。

如果您想在所见即所得/编辑器字段中使用此技术,请注意:由于TinyMCE使用iframe,这更为复杂。例如,您需要侦听JQuery sortable以在可排序开始时删除编辑器,然后在可排序停止时重新添加编辑器。还有更多的问题随之而来(我去过那里)。

结束

相关推荐

Jquery being loaded wrong

所以首先,我不太理解这种编码。如果我用错了词,那就对我直言不讳吧。我有一个叫做TablePress的插件。它从csv文件创建表,并使用jquery对表进行排序和搜索。可排序和搜索部分不起作用我使用了他们的支持,他们告诉我,jquery的旧版本正在从CDN加载,但Wordpress有最新版本,由于某种原因,没有加载。我有另一个名为“使用谷歌库”的插件,它使用CDN加载常见内容。我以为是这个插件导致了这个问题。我停用并删除了它。还是没什么。因此,必须有另一个插件,这是导致问题*笔记使用缓存插件,我在做了更改后