如何通过自定义插件保存应用于WP仪表板的JS类?

时间:2017-09-01 作者:RachieVee

我目前正在开发一个插件,在仪表板的后期编辑区域添加一个元框。metabox有“条件”字段,所以我想基于其他字段显示/隐藏字段,主要是为了用户。

我添加了一个JS文件,该文件可以添加/删除类以实现此效果。JS很好用,我的CSS也很好用。

However, any classes added or removed does not save once I hit the post\'s "update/publish" button. What step am I missing to ensure that when a post is saved, the state of my JS is saved as well? 我是否必须使用wp\\u localize\\u脚本之类的东西在JS/PHP之间传递内容?

我使用jQuery是因为我只需要JS来添加/删除类。我原以为Ajax在这种情况下会有点过头,但我对为插件编写JS还不熟悉,所以我愿意听取关于最佳实践的建议。提前感谢!:-)

附言:如果解释太大而无法在这里写,我愿意与特定资源链接。

不确定这是否有用,但我还是会把代码放进去。以下是我的文件排队:

function admin_scripts_styles( $hook ) {
   if ( $hook !== \'post.php\' ) {
       return;
   }

   //Yes, unfortunately, this is being done in a custom theme, not a plugin, hence get_template_directory_uri

   wp_enqueue_script( \'admin-featured-posts-scripts\', get_template_directory_uri() . \'inc/admin-js/admin-featured-posts.js\', [
    \'jquery\'
] );

    wp_enqueue_style( \'admin-featured-posts-scripts\', get_template_directory_uri() . \'inc/admin-css/admin-featured-posts.css\' );
}

//this gets called in an init() function but adding here for context
add_action( \'admin_enqueue_scripts\', [ $this, \'admin_scripts_styles\' ] );
这是我添加/删除类的函数。这不是我的整个JS文件,只是这个问题的函数。是的,文件正在排队,是的,这是正确触发的。它也可以正常工作,但一旦我更新/发布帖子,它就不会“保存”。它使用on-change事件处理程序激发。

function enableOptions() {
   var enableVal = $(this).attr(\'value\'),
       fieldOptions = $(\'#fieldWrapper\');

   if (enableVal === \'yes\') {
       fieldOptions.removeClass(\'disabled\');
   } else {
      fieldOptions.addClass(\'disabled\');
   }
}
下面是一个nonce的保存函数。发布或更新帖子时,“保存”部分的作用是保存字段值。

public function save_featured_metabox( $post_id ) {
    $nonce_action    = \'featured_metabox_nonce_action\';
    $nonce_name      = \'featured_metabox_nonce\';
    $featured_fields = [
        0 => \'featured_field_one\',
        1 => \'featured_field_two\',
        2 => \'featured_field_three\',
        3 => \'featured_field_four\',
    ];

    if ( ! isset( $_POST[ $nonce_name ] ) || ! wp_verify_nonce( $_POST[ $nonce_name ], $nonce_action ) ) {
        return $post_id;
    }

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

    foreach ( $featured_fields as $featured_field ) {
        update_post_meta( $post_id, \'_\' . $featured_field, $this->sanitize_featured_fields( $featured_field ) );
    }
}
我特意简化了文件/类名,并将其作为示例发布在这里。

1 个回复
SO网友:RachieVee

经过一番思考,我的问题可能不清楚,或者有太多的代码无法简洁地解释它。

我想要的是将类应用到元盒,这些类基于元盒中的选择框值显示/隐藏区域。该区域包含单选按钮,但对我提出的整个问题并不重要-抱歉造成混淆!我意识到我根本不需要与PHP通信。每次发布/更新帖子时,我创建的JS文件都会加载。

除了在我的问题中显示的JS函数之外,我还以“change”为例为#enable-field-here 选择框,我现在有一个加载时启动的函数。如果下拉列表设置为“是”,则会处理类,因此即使在发布/更新帖子之后,也会“保存”元数据库的状态。现在在jQuery中是这样的。我继续沿着这条路走下去,用同样的方法通过JS处理受类影响的任何其他区域。希望将来能帮助别人。:-)

var enableField = $( \'#enable-field-here\' );

setEnableDefault( enableField );
enableField.change( enableOptions );

function setEnableDefault( enableVal ) {
    var fieldOptions = $( \'#fieldWrapper\' );

    if ( enableVal === \'yes\' ) {
        fieldOptions.removeClass( \'disabled\' );
    } else {
        fieldOptions.addClass( \'disabled\' );
    }
}

function enableOptions() {
    var enableVal    = $( this ).attr( \'value\' ),
        fieldOptions = $( \'#fieldWrapper\' );

    if ( enableVal === \'yes\' ) {
        fieldOptions.removeClass( \'disabled\' );
    } else {
        fieldOptions.addClass( \'disabled\' );
    }
}

结束

相关推荐

有没有办法通过unctions.php在模板中“在页面上”推送javascript或css?

我的意思是,当我在函数中“enqueue\\u scripts”以将CSS或JS加载到模板中时,它会添加完整路径。我想做的是将Javascript实际发布到实际页面上,以便在页面上按如下方式推送它:<script> the javascript is printed ON the page NOT a Full Path </script> 我知道这有一个插件,但我想知道是否有一个更简单的\'功能。php的做法。。。换句话说,我正在努力加快网站的速度,也就是说,我正在尝试