定制插件:遍历分类类型并更新所有类型的列?

时间:2020-04-01 作者:Joel Hoelting

我有一个称为“狗”的分类法和多种狗类型:

"dog": {
    "name": "Dog",
    "slug": "dog",
    "description": "",
    "types": [
        "poodle",
        "retriever",
        "labrador",
        ...etc
    ],
}
每种狗都有一个图像自定义字段,我正在编写一个自定义插件,为每一行添加一个缩略图列。这是我的代码,您可以看到不必要的重复:

function update_poodle_columns( $columns ) {
    $columns = array(
        \'cb\' => $columns[\'cb\'],
        \'title\' => __( \'Title\' ),
        \'image\' => __( \'Image\' ),
        \'date\' => __( \'Date\' )
    );

    return $columns;
}

add_filter( \'manage_poodle_posts_columns\', \'update_poodle_columns\' );

function update_poodle_column( $column, $post_id ) {
    switch ( $column ) {
    case \'image\':
        $img_array = get_field(\'image\');
        $img = $img_array[\'sizes\'][\'thumbnail\'];
        echo \'<img src="\' . $img . \'" height="100px" width="100px" />\';
        break;
    case \'year\':
        echo get_field( \'year\', $post_id );
        break;
    }
}

add_action( \'manage_poodle_posts_custom_column\', \'update_poodle_column\', 10, 2);

function update_retriever_columns( $columns ) {
    $columns = array(
        \'cb\' => $columns[\'cb\'],
        \'title\' => __( \'Title\' ),
        \'image\' => __( \'Image\' ),
        \'date\' => __( \'Date\' )
    );

    return $columns;
}

add_filter( \'manage_retriever_posts_columns\', \'update_retriever_columns\' );

function update_25_retriever_column( $column, $post_id ) {
    switch ( $column ) {
    case \'image\':
        $img_array = get_field(\'image\');
        $img = $img_array[\'sizes\'][\'thumbnail\'];
        echo \'<img src="\' . $img . \'" height="100px" width="100px" />\';
        break;
    case \'year\':
        echo get_field( \'year\', $post_id );
        break;
    }
}

add_action( \'manage_retriever_posts_custom_column\', \'update_retriever_column\', 10, 2);
我希望避免对每种帖子类型重复相同的代码。如何循环分类法类型并动态调用函数?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

我在代码中看到的唯一不同之处是add_filter()add_action() 调用(例如回调/函数名),因此您可以对所有类型使用相同的函数:

function update_dog_type_columns( $columns ) {
    // your code

    return $columns;
}

function update_dog_type_column( $column, $post_id ) {
    // your code
}
然后,您可以这样做,为每种(post)类型注册筛选器/操作回调:

foreach ( array( \'poodle\', \'retriever\', \'labrador\', \'etc\' ) as $type ) {
    add_filter( "manage_{$type}_posts_columns", \'update_dog_type_columns\' );
    add_action( "manage_{$type}_posts_custom_column", \'update_dog_type_column\', 10, 2 );
}

替代解决方案

上述方法很好,但这可能更好地确保您的回调不会针对其他类型运行:

你可以manage_posts_columns 并使用$post_type 有条件运行筛选器/操作的参数:

function update_dog_type_columns( $columns, $post_type ) {
    if ( in_array( $post_type, array( \'poodle\', \'retriever\', \'labrador\', \'etc\' ) ) ) {
        // your code
    }
    return $columns;
}
add_filter( \'manage_posts_columns\', \'update_dog_type_columns\', 10, 2 );
然后钩住manage_pages_custom_column 和/或manage_posts_custom_column, 取决于任何“dog”帖子类型是否具有层次结构:

function update_dog_type_column( $column, $post_id ) {
    $post_type = get_current_screen()->post_type;
    if ( ! in_array( $post_type, array( \'poodle\', \'retriever\', \'labrador\', \'etc\' ) ) ) {
        return;
    }

    switch ( $column ) {
        // your code
    }
}
add_action( \'manage_pages_custom_column\', \'update_dog_type_column\', 10, 2 ); // for hierarchical post types
add_action( \'manage_posts_custom_column\', \'update_dog_type_column\', 10, 2 ); // non-hierarchical post types
但无论哪种方式,您都只需要两个函数。

所以我希望这有帮助?:)

相关推荐