将自定义帖子类型边栏链接到页面/帖子

时间:2015-10-29 作者:Nathan

我注册了一个新的帖子类型“侧边栏”,所以我可以随时创建不同的侧边栏。

function rh_create_sidebar_post_type() {
    $labels = array( 
        \'name\' => __( \'Sidebars\' ),
        \'singular_name\' => __( \'Sidebar\' ),
        \'add_new\' => __( \'New Sidebar\' ),
        \'add_new_item\' => __( \'Add New Sidebar\' ),
        \'edit_item\' => __( \'Edit Sidebar\' ),
        \'new_item\' => __( \'New Sidebar\' ),
        \'view_item\' => __( \'View Sidebar\' ),
        \'search_items\' => __( \'Search Sidebars\' ),
        \'not_found\' =>  __( \'No Sidebars Found\' ),
        \'not_found_in_trash\' => __( \'No Sidebars found in Trash\' ),
    );
    $args = array(
        \'labels\' => $labels,
        \'has_archive\' => false,
        \'public\' => true,
        \'hierarchical\' => false,
        \'supports\' => array(
            \'title\', 
            \'editor\', 
            \'excerpt\', 
            \'custom-fields\', 
            \'thumbnail\',
            \'page-attributes\'
        ),
    );
    register_post_type( \'sidebar_post\', $args );
} 
add_action( \'init\', \'rh_create_sidebar_post_type\' );
然后在页面/后期管理屏幕上,我加载一个元框,其中包含我创建的所有侧栏的组合框

function load_sidebar_custom_meta_box( $post )
{
    $value = get_post_meta( $post->ID, \'_rh_custom_sidebar\', true );

    // The Query
    $args = array(\'post_type\' => \'sidebar_post\');
    $the_query = new WP_Query( $args );
    // The Loop
    if ( $the_query->have_posts() ) {
        echo \'<select name="rh_custom_page_sidebar" id="rh_custom_page_sidebar">\';
        echo \'<option value="-1">No Sidebar</option>\';
        while ( $the_query->have_posts() ) {
            $the_query->the_post();
            $selected = \'\';
            if ( get_the_ID() == $value )  {
                $selected = \'selected\';
            }
            echo \'<option value="\'. get_the_ID() . \'" \' .$selected .\'>\' . get_the_title() . \'</option>\';
        }
        echo \'</select>\';
    }
    wp_reset_postdata(); //So custom sidebar post type doesn\'t overwrite main query
}
这两件很好用。然而,每当我选择一个侧栏并单击保存时,它就会将我的页面slug/URL更改为侧栏帖子类型中的URL。我不能把它改回来。无论我在顶部手动编辑它,然后单击“确定”然后单击“更新”,它都会返回到提要栏URL/slug。

例如.com/about-us 我正在尝试编辑的页面现在是.com/default-sidebar 我不能把它改回来。

这里是我的保存方法,不提post_name.

add_action( "save_post", "save_sidebar_post_page", 100 );
function save_sidebar_post_page( $post_ID )
{
    if ( defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE ) {
        return $post_ID ;
    }
    global $post;
    if( isset( $_POST[\'rh_custom_page_sidebar\'] )) {
        update_post_meta( $post_ID, \'_rh_custom_sidebar\', $_POST[\'rh_custom_page_sidebar\'] );
    }
}

UPDATE

注意到,当我在默认Wordpress页面部分中单击“新建页面”时,它似乎认为这是我的自定义post\\u类型sidebar_post. 在单击Yoast选项卡进行页面分析时注意到,它有以下错误:

“未为此设置焦点关键字sidebar_post. 如果未设置焦点关键字,则无法计算分数。“”

所以,出于某种原因,当它创建一个新页面时,它会认为这是一个侧边栏帖子,所以这一定是在我发布或更新时发生的,这会导致我对permalink的问题。然而,我没有看到在我的代码中,这两件事会在哪里混淆?

UPDATE 2

这似乎是在我第一次在页面上设置自定义侧栏之后发生的。它工作得很好,我的permalink在前端正确加载。但是,如果我再次在管理员中编辑同一页,它看起来就像加载了侧栏post_name 在admin的隐藏输入字段中。

所以当我更新页面时post_name 正在提交。在第一次保存后,在源代码中找到以下嵌入内容。值应为about-us.

<div class="inside">
<label class="screen-reader-text" for="post_name">Slug</label><input name="post_name" type="text" size="13" id="post_name" value="test-sidebar-post">
</div>
看起来发生的是我的WP_Query 正在覆盖全局$post 变量我现在明白你在说什么了,米洛。尝试使用get_posts

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

这是WP_Query 覆盖我的主查询。使用get_posts 已修复此问题。

相关推荐