以数组为参数的OOP Switch语句

时间:2020-02-27 作者:DevSem

因此,在将switch语句应用于过滤器时,我遇到了一些问题,当我定义case字符串时,它将其应用于我拥有的两列:

通过定义“authors”,它会覆盖“authors”和“Types”列,我如何才能这样定义它Column:get_columns(\'authors\', \'recipe-types\') 它将同时拉取作者案例和配方类型?

Here is the filters:

add_action(\'manage_recipe_posts_custom_column\', function ($column) {
    Column::get_columns(\'authors\');
}, 10, 3);

add_filter(\'manage_edit-recipe_columns\', function($columns) {
    unset($columns[\'author\']);

    $columns = [
        \'cb\' => \'<input type="checkbox" />\',
        \'title\' => __(\'Title\'),
        \'authors\' => __(\'Authors\'),
        \'recipe-types\' => __(\'Types\'),
        \'tags\' => __(\'Tags\'),
        \'categories\' => __(\'Categories\'),
        \'date\' => __(\'Date\'),
    ];
    return $columns;
});

// Add \'Authors\' column to display all authors
add_filter(\'manage_recipe_posts_columns\', function($columns) {
    return array_merge($columns, [
        \'authors\' => __(\'Authors\'),
    ]);
});
Here is an example (用相同的结果覆盖两列,而不仅仅是“作者”列):
enter image description here

Here is the class that I\'ve created:

class Column
{
    public static function get_columns($column = \'\')
    {
        switch ($column) {
            case \'authors\':
                $recipe = Recipe::init($id);

                if (is_array($recipe) || is_object($recipe)) {
                    $authors = $recipe->get_authors();

                    if (isset($authors) && !empty($authors)) {
                        $arr = [];
                        foreach ($authors as $profile) {
                            $arr[] = \'<a href="\' . $profile->get_url() . \'">\' . $profile->get_name() . \'</a>\';
                        }
                        echo implode(\', \', $arr);
                        break;
                    }
                    echo "Blank";
                    break;
                } else {
                    echo \'Blank\';
                }
                break;

            case \'recipe-types\':

                $categories = get_the_term_list(\'\', \'recipe-types\', \'\', \', \',
                    \'\');

                if (!empty($categories)) {
                    echo $categories;
                } else {
                    echo \'&ndash;\';
                }

                break;
        }

        return $column;
    }
}

1 个回复
SO网友:Tom J Nowell

它总是显示作者,因为您总是输出作者列,即使$column 具有不同的值。

让我们把过滤器换掉$column 用于演示其字符串值。

首先,WP需要authors列的输出:

add_action(\'manage_recipe_posts_custom_column\', function (\'authors\') {
    Column::get_columns(\'authors\');
}, 10, 3);
接下来,它再次调用该操作,但对于recipe-types 列:

add_action(\'manage_recipe_posts_custom_column\', function (\'recipe-types\') {
    Column::get_columns(\'authors\');
}, 10, 3);
请注意,即使操作告诉您要输出哪个列,该值也会被忽略。此外,请注意,该操作会使用不同的列值多次调用。想想像事件这样的行为,一个事件可以发生多次。

此外,静态方法Column::get_columns 将采用任意列名并生成正确的响应,或者至少尝试。switch语句很好,但它总是接收相同的值,这个问题与类、对象或switch语句无关,即使它只是一个函数调用,也会发生。

因此,与其将其硬编码为authors 并且想知道为什么它总是显示作者,而是传入column变量。

这让我想到Column 班这不是OOP,它只是将单个函数转换为类的静态方法。我建议删除Column 类并仅使用函数。为了实现面向对象编程,我希望能够创建Column 对象,并传入参数,并让对象自行注册所有内容,无需使用静态方法,也无需为每个列继承Column 为每个自定义列创建的对象。这样的实施将过于工程化。只需像在其他地方一样使用函数。

此外,它应该回显其输出return 陈述不正确。

相关推荐

如何输出所有的Apply_Filters和Do_action?

我想输出所有apply\\u过滤器和do\\u操作,以向用户提供它们的概述。如果我使用代码add_filter( \'wpErpOs_testFilter\', \'wpErpOs_testFilter_callback\', 10, 1 ); function wpErpOs_testFilter_callback( $testVar ) { $testVar[] = \"GM\"; return $testVar; } $testVar = array(\"V