如何将自定义元保存为一个全局值?

时间:2013-11-25 作者:Eoghan OLoughlin

我已经在我的一个自定义帖子类型中添加了一个自定义元框。它包含一个复选框,指示这是“特色月度产品”(只能有一个)。

当我选中此框时,我想更新一个全局自定义值,该值可以在任何地方访问。

换句话说:我想更新一个自定义元字段,而不是特定于帖子。

这可能吗?

我知道有一个选项可以创建一个全局选项页面,但我需要在编辑范围内。php。

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

考虑一下,当您添加一个元盒时,没有什么强迫您在post meta字段中保存值,您也可以从元盒中保存一个全局选项。

function my_add_custom_box() {
  $screens = array( \'post\' ); // add or replace with your cpt name
  foreach ( $screens as $screen ) {
    add_meta_box(
      \'my_sectionid\', __( \'Featured Monthly Product\', \'my_textdomain\' ), \'my_inner_custom_box\',
      $screen
    );
  }
}
add_action( \'add_meta_boxes\', \'my_add_custom_box\' );


function my_inner_custom_box( $post ) {
  wp_nonce_field( \'my_inner_custom_box\', \'my_inner_custom_box_nonce\' );
  $value = (int) get_option( \'featured_monthly_product\') === (int) $post->ID ? 1 : 0;
  echo \'<label for="featured_monthly_product">\';
  _e( "Is this the Featured Monthly Product?", \'my_textdomain\' );
  echo \' <input type="checkbox" name="featured_monthly_product" value="1"\' . checked(1, $value, false) . \' />\';
  echo \'</label> \';
}

function my_save_post_option( $post_id ) {
  $nonce = filter_input(INPUT_POST, \'my_inner_custom_box_nonce\', FILTER_SANITIZE_STRING); 
  if ( ! $nonce ) return $post_id;
  if ( ! wp_verify_nonce( $nonce, \'my_inner_custom_box\' ) ) return $post_id;
  if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return $post_id;
  $checked = (int) filter_input(INPUT_POST, \'featured_monthly_product\', FILTER_SANITIZE_NUMBER_INT); 
  if ($checked > 0) {
    update_option( \'featured_monthly_product\', $post_id );
  } elseif ( (int) $post_id === (int) get_option(\'featured_monthly_product\') ) {
    delete_option(\'featured_monthly_product\');
  }
}

add_action( \'save_post\', \'my_save_post_option\' );
您没有解释要在该自定义值上保存什么,所以我猜您想存储post ID,如果不想,请相应地更改代码。

上面的代码显示了一个带有复选框的元框。保存帖子时,如果选中该复选框,则当前帖子id将保存到选项中featured_monthly_product.

如果复选框未选中,并且帖子是特色月度产品,则该选项将被删除。

如果要全球化该价值,请使用

add_action(\'init\', \'globalize_featured_monthly_product\');

function globalize_featured_monthly_product() {
  global $featured_monthly_product;
  $featured_monthly_product = get_option(\'featured_monthly_product\');
}
之后,无论您在哪里需要特色月度产品id,只需使用:

global $featured_monthly_product;
// just an example:
echo "The featured monthly product id is: " . $featured_monthly_product;

结束