使用自定义字段作为自定义帖子标题

时间:2011-11-10 作者:Jonathan Wold

我已经使用WPAlchemy类设置了一个带有一系列自定义字段的自定义帖子类型。我试图获取其中一个自定义字段的值,并将其用作文章标题。不过,到目前为止,我还没有成功。我一直在浏览,并尝试了以下两种不同的代码块:

function custom_post_type_title ( $post_id ) {
    global $wpdb;
    if ( get_post_type( $post_id ) == \'listing\' ) {
        $title = get_post_meta($post_id, \'listing_name\', true);
        $where = array( \'ID\' => $post_id );
        $wpdb->update( $wpdb->posts, array( \'post_title\' => $title ), $where );
    }
}

add_action(\'init\', \'listing_save_post\');
function listing_save_post( $post_id ) {
        if ( ! defined( \'DOING_AUTOSAVE\' ) && ! DOING_AUTOSAVE ) return;
        add_action(\'save_post\', \'custom_post_type_title\', 100);
        add_action(\'publish_post\', \'custom_post_type_title\', 100);
}
和。。(暂时注释nonce字段,直到我弄清楚它们是如何工作的)

add_filter(\'wp_insert_post_data\', \'change_title\', 99, 2);
function change_title($data, $postarr)
{    
    // If it is our form has not been submitted, so we dont want to do anything
    if(defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE) return;

    // Verify this came from the our screen and with proper authorization because save_post can be triggered at other times
   // if(!isset($_POST[\'my_nonce_field\'])) return;

    // If nonce is set, verify it
   // if(isset($_POST[\'my_nonce_field\']) && !wp_verify_nonce($_POST[\'my_nonce_field\'], plugins_url(__FILE__))) return;

       // Combine address with term
    $title = $_POST[\'listing_name\'];
    $data[\'post_title\'] = $title;

    return $data;
}
在这两种情况下,结果是相同的:

保存新帖子时,它会重新加载页面,并表示它正常工作,所有自定义字段均为空。(没有任何一个代码集运行,自定义贴子工作正常,字段保存)。

查看自定义帖子类型索引时,帖子不在那里。

有什么想法吗?

UPDATE

为了澄清,我使用的是一篇没有标题支持的自定义帖子。尽管如此,我还是尝试使用自定义字段中的值填充标题字段。

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

因此,每次保存帖子时,都要用自定义字段中的另一个值替换刚保存的标题的值。。。

似乎你应该把你想要的头衔放在实际的头衔字段中。

但我假设这是出于表示目的:您希望自定义帖子类型根据自定义字段的值在前端显示不同的标题。过滤器是实现这一点的简单方法。

the_title, 通用模板标记是一个非常薄的包装get_the_title, 其中包含一个名为the_title. 它有两个参数:实际标题和帖子ID。钩住它并根据自定义字段更改标题。

<?php
add_filter( \'the_title\', \'wpse33385_filter_title\', 10, 2 );
function wpse33385_filter_title( $title, $post_id )
{
    if( $new_title = get_post_meta( $post_id, \'custom_field_name\', true ) )
    {
        return $new_title;
    }
    return $title;
}

A few things about your code to keep in mind:

操作不会任意接收参数。连接到的函数init 例如,不要将任何参数传递给他们。什么时候do_action 调用时,第一个参数是挂钩名称。如果需要,后续参数将传递给hooked in函数(由的第四个选项参数指定add_action).

这个do_action( \'init\' ); 呼叫处于wp设置中。php。Take a look, 没有参数。

因此:

<?php
add_action(\'init\', \'listing_save_post\');
function listing_save_post( $post_id ) {
        if ( ! defined( \'DOING_AUTOSAVE\' ) && ! DOING_AUTOSAVE ) return;
        add_action(\'save_post\', \'custom_post_type_title\', 100);
        add_action(\'publish_post\', \'custom_post_type_title\', 100);
}
不会像你期望的那样工作。此外add_action 调用函数内部,可以只对自己的函数外部进行调用。。。这很好:

add_action(\'save_post\', \'custom_post_type_title\', 100);
function custom_post_type_title( $post_id ) {
    // do stuff
}
只需要在save_post, 不在那上面publish_post

我总是尽量避免直接去$wpdb 如果可以的话,因为很多时候都有更方便的API。你想做的是更新帖子。So使用wp_update_post. 在您的情况下,这不是一个有效的选项(正如法典所述,它可能会导致无限循环)。

抱歉,那有点冗长。希望它澄清了WordPress挂钩系统的一些问题!

让这些成为你最好的朋友:

WP挂钩数据库:http://adambrown.info/p/wp_hooks/hook http://xref.yoast.com/

SO网友:PC Doctor Go

谢谢你,你的过滤器工作得很好。

仅供参考

我添加了一个检查,以查看是否在管理中防止在编辑页面时将条目标题更改为自定义的“longtitle”(默认值=菜单项标题)。

function pcdg_filter_title( $title, $post_id )
{
    if(!is_admin())
    {
        if( $new_title = get_post_meta( $post_id, \'longtitle\', true ) )
        {
            return $new_title;
        }
    }
    return $title;
}
add_filter( \'the_title\',\'pcdg_filter_title\',10,2 );

结束

相关推荐

在另一个metabox中使用WPAlChemy metabox值

我正在构建一个非常复杂的自定义帖子类型结构,我需要一些关于我的元盒的帮助。我想做什么:谢谢have_fields_and_multi() 功能,用户在简单的文本输入字段中输入数据(使用“添加新”按钮)应使用以前文本输入的值来构建select 另一个元框中的下拉列表</为了简单起见,这里有一个模型(也附在这篇文章后面):http://idzr.org/0c95我有第一部分工作,很简单。但我不知道如何让第二部分发挥作用。如果我使用while($mb->have_fields_and_multi(\