在特定的管理选项页面上运行查询,并将结果发送到另一个功能中的选择字段

时间:2017-11-09 作者:Clayton Collie

如何在插件的单个选项页面上运行get\\u posts查询,并将这些结果发送到另一个函数以填充选择字段?

我正在构建一个自定义插件,该插件从各种帖子类型的自定义字段构建vcard。

在由CMB2生成并加载到CMB2\\u admin\\u init的“我的选项”页面上,我有各种选择字段,这些字段显示我通过对所有帖子类型运行查询找到的meta\\u关键字。随着每种帖子类型中条目的增长,我自然会看到大量的查询。因此,我只想在特定的管理选项页面上运行该查询。这是我唯一需要这个查询的时候。

我一直在尝试使用“load-{options page.php}”操作挂钩,它工作得很好,但我不知道如何运行该查询,然后在cmb2\\u admin\\u init上启动的函数中获得结果。它们都在一个类中,所以我可以传递一个变量?但ti似乎总是重新运行查询,因为变量是在cmb2\\u admin\\u init上启动的函数内分配的。

我可以在“load-[name of optins page.php}”上运行此方法

/**
 * Convert to array for CMB2 field type
 * @since  0.1.0
 */
public function get_meta_keys_array() {
    $options = array();
    // Get keys from a WP_Query
    $fields = $this->get_meta_keys();
    if( $fields ) {
        // Builds simple array to populate my select fields
        foreach( $fields as $field => $key ) {
            $options[$key] = $key;
        }
    } 
    return apply_filters( \'vcard_get_meta_keys_array_output\', $options );
}
然后此函数用于“cmb2\\u admin\\u init”上的字段显示

/**
 * Registers options page menu item and form.
 *
 * @since    1.9.0
 */
public function register_options_metabox() {

    // This is where I am running into trouble.
    $meta_keys = $this->get_meta_keys_array();  

    $cmb_options = new_cmb2_box( array(
        \'id\'           => \'vcard_generator_metabox\',
        \'title\'        => esc_html__( \'vCard Generator Settings\', $this->plugin_name ),
        \'object_types\' => array( \'options-page\' )


        $cmb_options->add_field( array(
            \'name\'             => esc_html__($person[\'name\'], $this->plugin_name),
            \'id\'               => \'vcard_generator_metabox\' . $person[\'id\'],
            \'type\'             => \'select\',
            \'show_option_none\' => true,
            \'default\'          => \'custom\',
            \'options\'          => $meta_keys // This is where the meta_keys are populated
        ) );

}
请注意,这些函数被截断,不能用于复制/粘贴

2 个回复
最合适的回答,由SO网友:Phil 整理而成

如果我理解正确,答案很简单。

如果这两个函数都在同一个类中,请在类上设置一个属性,用于存储运行的第一个函数的输出。从那里,任何后续函数都可以访问存储在该属性上的数据。

SO网友:Satish Gandham

您可以对具有distinct的元表使用查询,而不是迭代每个帖子。

从wp\\U Posteta中选择DISTINCT meta\\u key;

这将更快、更高效,尽管DISTINCT很昂贵。https://codex.wordpress.org/Custom_Queries

您不能总是进行此查询。将查询结果保存在瞬态变量中。https://codex.wordpress.org/Transients_API如果未设置变量,请使查询将结果存储在瞬态中

结束

相关推荐

是否以编程方式取消序列化WP_OPTIONS选项?

我需要以编程方式取消wp\\U选项的序列化。我正在创建一个Java应用程序来更改数据库信息,例如wp\\u选项上的一些选项,这样我就不需要访问面板来进行更改。如何取消序列化选项,如 a:4:{i:0;s:5:\"posts\";i:1;s:5:\"pages\";i:2;s:4:\"tags\";i:3;s:10:\"categories\";} 或 a:1:{s:12:\"_multiwidget\";i:1;} 更改它们并重新序列化到数据库?谢谢