添加一个php函数到javascript文件与AJAX (tinymce + wordpress相关)


Add a php function to a javascript file with AJAX (tinymce + wordpress related)

我正在为wp WYSIWYG编辑器创建一个tinyMCE按钮。基本上,当用户点击按钮时,会弹出一个模态表单,他们必须输入几个字段。然而,其中一个字段需要是一个列表框,列出每个帖子类别和用户将选择一个。基本语法如下:

{
type: 'listbox', 
name: 'sds-category', 
label: 'Category', 
'values': [
    {text: 'Name Of Cat', value: 'Cat ID'},
    {text: 'Name Of Cat', value: 'Cat ID'},
    {text: 'Name Of Cat', value: 'Cat ID'}]}

为了让所有类别都像这样显示我使用了一个php函数它会为每个类别吐出{text: '', value: ''}语法它是这样的

function write_cat_list($cat){
    $cats = get_categories('hide_empty=false&orderby=name&order=ASC&parent=' . $cat);
    if($cats) :
        foreach ($cats as $cat) :
            $tinyMCE_list[] = "{text: '".$cat->name."', value: '".$cat->term_id."'}";
            write_cat_list($cat->term_id);
        endforeach;
        echo implode(',', $tinyMCE_list);
    endif;
}

所以现在剩下的就是把PHP函数write_cat_list(0)放入我的。js文件中,这就是我完全卡住的地方!

我不知道如何去做这件事,因为我是非常非常没有经验的AJAX,有一个简单的方法或jquery函数,这将使它很容易包括我的php函数到这个js文件?

由于您正在递归地收集类别,因此在foreach循环中打印值,或者将值收集到数组中(就像您正在做的那样)并进一步传递。下面是一个例子:

function list_categories( $cat_id, &$output = array() )
{
    $categories = get_categories( 'hide_empty=0&orderby=name&order=ASC&parent=' . $cat_id );
    foreach( $categories as $cat ) {
        $output[] = array( 'text' => $cat->name, 'value' => $cat->term_id );
        list_categories( $cat->term_id, $output );
    }
    return $output;
}
$list = list_categories(0); // to get an array of categories

有几种方法可以将输出包含到.js文件中。如果脚本是用.php文件生成的,那么使用:

'values': <?php echo json_encode( list_categories(0) ); ?>

如果是外部文件,一个选项是本地化脚本:

wp_localize_script( 'some_handle', 'mce_options', array( 'categories' => json_encode( list_categories(0) ) ) );
// later in .js file
'values': mce_options.categories

另一个选项是直接在admin_head中打印值:

add_action( 'admin_enqueue_scripts', 'mce_admin_scripts' );
function mce_admin_scripts( $hook ) {
    if ( $hook == 'post.php' || $hook == 'post-new.php' ) {
        add_action( "admin_head-$hook", 'mce_admin_head' );
    }
}
function mce_admin_head() {
    echo '<script type="text/javascript">var mce_options=' . json_encode( array( 'categories' => list_categories(0) ) ) . '; </script>';
}